跳到主要内容

协议启动

需要 AScript 版本 大于 4009

低于该版本的 App 没有注册协议入口,链接点了不会有任何反应。请先升级到 4009 以上版本。

通过 URL Scheme 从外部拉起 AScript 并运行小程序 —— 等价于用户手动打开 App、 找到小程序、点「运行」。

ascript://run?id=123
使用场景
  • 从别的 App、H5 页面、二维码直接拉起脚本
  • adb 命令远程启动,做批量设备调度
  • 桌面建快捷方式,一键跑指定脚本
  • 配合系统自动化工具(如 Tasker、快捷指令类应用)定时触发

每个 App 注册两个 scheme

scheme 不是固定的 ascript://,它由 App 的包名决定。每个包都会注册两个

applicationId注册的 scheme
com.aojoy.airscript母包ascript:// + com.aojoy.airscript://
com.yourcompany.yourapp变形包示例)yourapp:// + com.yourcompany.yourapp://

规则是:

  1. 短 scheme —— 取 applicationId 的最后一段。 母包最后一段是 airscript,但为了简短,特例映射成 ascript。 变形包就是最后一段本身:com.yourcompany.yourappyourapp
  2. 完整包名 scheme —— 直接把 applicationId 当作 scheme。 这条不依赖任何构建期计算,改包名时天然跟着变,是最稳妥的兜底通道。
分发给别人的链接,优先用完整包名那条

短 scheme 可能和别的 App 撞车(比如另一个应用也注册了 yourapp://), 系统会弹选择框甚至指向错误的 App。完整包名几乎不可能重复,用它最保险:

com.yourcompany.yourapp://run

支持的动作

scheme://<动作>?<参数>
写法说明
ascript://run?id=123运行 id 为 123 的在线小程序
ascript://run变形包运行自身;等价于裸写 ascript://
ascript://run?local=小程序名称运行本地小程序(仅母包有效
ascript://open?id=123只打开小程序详情页,不自动运行
ascript://stop停止当前正在运行的小程序

不写动作(裸 ascript://)按 run 处理。

母包与变形包的区别

这是最容易踩坑的地方 —— 同一个链接在两种包里行为不同

母包(com.aojoy.airscript变形打包的 App
?id= 参数生效,运行指定 id 的小程序被忽略,强制运行自身那一个
?local= 参数生效,运行本地小程序被忽略
stop生效生效
首次未选运行模式提示「请先完成运行模式选择」并跳到选择页自动使用无障碍模式,直接跑

为什么变形包忽略 id

这是刻意的安全设计

变形包是打包成独立 APP 的产物,它只包含并授权了自己那一个小程序。 如果协议能指定任意 id,那么拿一个已授权的变形包当壳子,就能用它跑任何别人的小程序, 授权体系直接被绕过。

所以变形包一律用自身 id,URI 里写什么都不看。

实际写法

母包要指定跑哪个:

ascript://run?id=123
ascript://run?local=我的脚本
ascript://open?id=123

local 传的是小程序名称,也就是工程在本地的文件夹名——两者是同一个值, 在 App 的本地小程序列表里看到的就是它。名称里有中文或空格时记得做 URL 编码。

变形包不需要 id,写不写都一样:

yourapp://run
yourapp://
com.yourcompany.yourapp://run

用 adb 调试

最快的验证方式:

adb shell am start -a android.intent.action.VIEW -d "ascript://run?id=123"

变形包:

adb shell am start -a android.intent.action.VIEW -d "com.yourcompany.yourapp://run"

停止运行中的小程序:

adb shell am start -a android.intent.action.VIEW -d "ascript://stop"
信息

-d 后面的 URL 要用引号包起来,否则 shell 会把 ?& 当成自己的语法吃掉。

从网页或其它 App 调起

普通链接即可:

<a href="ascript://run?id=123">运行脚本</a>

Android 原生代码:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("ascript://run?id=123"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
浏览器里可能被拦截

部分浏览器(尤其是微信内置浏览器)会屏蔽非 http/https 的 scheme 跳转。 这是浏览器的限制,不是 AScript 的问题 —— 引导用户用系统浏览器打开, 或改用二维码 / 桌面快捷方式的方式分发。

注意事项

  • 协议启动会走完整的运行前检查:存储权限、拉取小程序信息、授权卡校验。 免费小程序会自动开始运行;付费小程序没有有效卡密时,会停在输入卡密的界面。 这与用户手动点「运行」的流程完全一致。
  • 母包首次使用前必须先选运行模式。没选过的话,协议启动会提示并跳转到模式选择页, 选完之后再调用协议即可正常运行。变形包则自动使用无障碍模式。
  • id 必须是合法的正整数,否则会提示「协议缺少合法的小程序id」。
  • 重复调用协议不会启动多个实例 —— 入口 Activity 是 singleTask,会复用已有任务栈。

相关