协议启动
需要 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:// |
规则是:
- 短 scheme —— 取 applicationId 的最后一段。
母包最后一段是
airscript,但为了简短,特例映射成ascript。 变形包就是最后一段本身:com.yourcompany.yourapp→yourapp。 - 完整包名 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,会复用已有任务栈。
相关
- 打包为独立 APP —— 变形包是怎么来的
- 使用权限与激活码 —— 授权卡校验的规则
- 加载 apk、aar、jar