Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 327695f86b | |||
| 44ebe3c903 | |||
| f88b594dd8 | |||
| 710bc8b7e2 | |||
| f03cb43cd1 | |||
| 4ad84cfffc | |||
| 1b4364f151 | |||
| ecc3c21444 | |||
| 8ab32bf7df | |||
| afdae275c4 | |||
| 8fae904ea6 | |||
| c3b5955ca2 | |||
| 4520aeb2d8 | |||
| 0622e92cfe | |||
| 07ba7fe01b | |||
| 9ceada798e | |||
| 3157c694e5 | |||
| fbc9b67b51 | |||
| 4fdd393789 | |||
| cc678e0ad0 | |||
| 2988069bcd |
@@ -1,51 +1,7 @@
|
|||||||
# iOS 快捷指令 A2iReply — 自由输入回复
|
# A2iReply 快捷指令迁移说明
|
||||||
|
|
||||||
a2i 转发的通知在 iPhone 上**长按**出「回复」按钮后,会触发本快捷指令:弹出输入框让你打字,再把回复 POST 回 a2i 的反向 reply topic,a2i 收到后用 RemoteInput 回复原 App(短信/微信等)。
|
GotMsg v1.11.0 已移除旧的 iOS 快捷指令和 ntfy `_reply` topic 方案。请删除原有的 `A2iReply` 快捷指令;GotMsg 不再订阅或使用 `_reply` topic。
|
||||||
|
|
||||||
## 一次性配置
|
新版本把一次性回复地址设置为 Bark / ntfy 通知的点击地址或“回复”动作,不会在通知正文中重复显示。iPhone 和 Android 都可直接打开网页输入回复,无需另外安装快捷指令或修改现有 ntfy topic。
|
||||||
|
|
||||||
### 1. 记下 ntfy 配置
|
完整的安装要求、Shizuku / 无障碍配置、PIN 自动解锁和故障排查见 [通知远程回复](notification-reply.md)。
|
||||||
在 a2i「设置 → ntfy」记下一个已启用的 ntfy 配置:
|
|
||||||
- `server`:如 `https://ntfy.sh` 或自建 `https://ntfy.songer.eu.org`
|
|
||||||
- `topic`:如 `mytopic`
|
|
||||||
- `token`:若有鉴权则记下(自建 ntfy 常需要)
|
|
||||||
|
|
||||||
**反向 reply topic = `topic` + `_reply`**,例如 `mytopic_reply`。a2i 自动订阅这个派生 topic,快捷指令也往这里 POST。
|
|
||||||
|
|
||||||
### 2. iPhone 装 ntfy app
|
|
||||||
App Store 装 ntfy,订阅同 `mytopic`(用于收 a2i 转发的通知)。
|
|
||||||
|
|
||||||
### 3. 录制快捷指令 A2iReply
|
|
||||||
打开「快捷指令」app → 新建快捷指令,**命名为 `A2iReply`**(必须恰好此名,大小写一致)。
|
|
||||||
|
|
||||||
添加以下动作:
|
|
||||||
|
|
||||||
1. **要求输入**(Ask for Input)
|
|
||||||
- 类型:文本
|
|
||||||
- 提示:`输入回复内容`
|
|
||||||
- 把输出命名为「回复内容」
|
|
||||||
|
|
||||||
2. **获取 URL 内容**(Get Contents of URL)
|
|
||||||
- URL:`https://<server>/<topic>_reply`,例如 `https://ntfy.sh/mytopic_reply`
|
|
||||||
- 展开「显示更多」
|
|
||||||
- 方法:`POST`
|
|
||||||
- 请求头(若 ntfy 有 token 才加):
|
|
||||||
- `Authorization` = `Bearer <你的token>`
|
|
||||||
- 请求体:选 `JSON`,添加字段:
|
|
||||||
- `message` = 「回复内容」(第 1 步的输出)
|
|
||||||
- `title` = 「快捷指令输入」(Shortcut Input,即通知按钮 URL 传入的 `msgId=xxx`)
|
|
||||||
|
|
||||||
### 4. 允许运行
|
|
||||||
首次从通知触发可能需在「设置 → 快捷指令」允许「允许运行」/信任不受信任的快捷指令。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
1. 让 a2i 收一条短信(另一台手机发来)。
|
|
||||||
2. iPhone 收到 ntfy 通知 → 长按 → 点「回复」→ 快捷指令弹出 → 输入文字 → 自动发送。
|
|
||||||
3. 安卓端:a2i 收到回复 → 短信 App 自动回复该消息。
|
|
||||||
4. a2i「日志」页可见 `回复` 类型的 sent/failed 记录。
|
|
||||||
|
|
||||||
## 注意
|
|
||||||
- **公共 ntfy.sh 隐私**:reply topic 明文,任何人可读。生产建议自建 ntfy + token 鉴权。
|
|
||||||
- `title` 字段必须设为「快捷指令输入」(含 `msgId=` 前缀),a2i 靠它匹配原通知;删掉或改写会导致回复无法路由。
|
|
||||||
- 若原通知已被划掉/超 10 分钟,a2i 日志会记 `回复失败/原通知已失效`,属正常。
|
|
||||||
- 快捷指令名必须是 `A2iReply`,否则 a2i 通知按钮的 `shortcuts://run-shortcut?name=A2iReply` 触发不到。
|
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
# 通知远程回复
|
||||||
|
|
||||||
|
GotMsg 可以从 Bark、ntfy、Telegram、飞书、钉钉、Meow、电邮或短信兜底消息打开一次性回复网页,把回复送回运行 GotMsg 的原 Android 手机。系统会优先使用通知自带的 Android `RemoteInput`;QQ 等应用可使用无障碍兼容回复,微信使用 Shizuku 回复。
|
||||||
|
|
||||||
|
> 远程回复不是模拟登录,也不会接管微信或 QQ 账号。能否成功取决于原通知是否仍然存在、原手机是否在线,以及目标应用当前界面是否可识别。
|
||||||
|
|
||||||
|
## 开始前准备
|
||||||
|
|
||||||
|
1. 在原 Android 手机上安装 GotMsg,并授权“通知使用权”。
|
||||||
|
2. 至少启用一个支持接收回复入口的转发配置。短信兜底只有在原手机能够联网注册回复会话时才会附带入口。
|
||||||
|
3. 关闭针对 GotMsg 的省电限制,允许后台运行和自启动。
|
||||||
|
4. 根据要回复的应用完成下面的额外配置:
|
||||||
|
- 通知本身带快捷回复:无需额外配置。
|
||||||
|
- QQ、支付宝、淘宝、钉钉:打开 GotMsg“设置 → 通知回复 → 无障碍兼容回复”,并在系统无障碍设置中启用“GotMsg 兼容回复”。
|
||||||
|
- 微信:安装并启动 [Shizuku](https://shizuku.rikka.app/download/),授权 GotMsg。微信实际回复走 Shizuku,不依赖系统无障碍服务。
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
1. 原手机收到通知后,GotMsg 注册一次性回复会话,并将通知转发到已启用通道。
|
||||||
|
2. 在接收端点击通知、“回复”按钮或正文中的回复链接。
|
||||||
|
3. 网页会显示应用名、通知标题和正文;输入内容并提交。
|
||||||
|
4. 原手机拉取任务并执行回复,网页等待最终结果;GotMsg“日志”页也会记录结果。
|
||||||
|
|
||||||
|
Bark、ntfy、Telegram、飞书和钉钉优先把回复入口作为点击地址、动作或按钮;Meow 同时发送原生 `url` 跳转字段和可见链接,电邮与短信使用可点击的纯文本链接。带回复入口的短信最长控制为两个分段,可能消耗两条短信额度。原手机完全断网时无法预先向中继注册一次性会话,因此那一条短信不会附带回复链接。短信 App 中识别出的验证码通知不会创建回复会话,也不会附加回复入口。接收端不需要 iOS 快捷指令,也不需要创建或订阅 `_reply` topic;现有 ntfy server、topic 和 token 无需改变。
|
||||||
|
|
||||||
|
## 三种执行方式
|
||||||
|
|
||||||
|
| 方式 | 适用范围 | 额外要求 | 是否会打开原应用 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Android `RemoteInput` | Telegram、WhatsApp、Signal、部分短信和企业 IM;以该条通知实际提供的动作为准 | 无 | 否 |
|
||||||
|
| 无障碍兼容回复 | QQ、支付宝、淘宝、钉钉 | 启用 GotMsg 无障碍服务 | 是 |
|
||||||
|
| Shizuku 回复 | 微信 | Shizuku 已启动并授权 GotMsg | 是 |
|
||||||
|
|
||||||
|
### Android `RemoteInput`
|
||||||
|
|
||||||
|
这是最稳定的方式。GotMsg 直接调用原通知提供的快捷回复动作,不需要打开原应用,也不要求原手机停留在聊天界面。原应用若没有为这条通知提供自由文本回复动作,则无法强制使用此方式。
|
||||||
|
|
||||||
|
### 无障碍兼容回复
|
||||||
|
|
||||||
|
GotMsg 会打开通知指向的会话,识别输入框、写入文本并点击文字明确匹配“发送”的控件。它只对白名单应用生效;输入框已有草稿时会主动停止,避免覆盖原内容。
|
||||||
|
|
||||||
|
执行结束后,有 Shizuku 时会把 GotMsg 切回前台;没有 Shizuku 时会通过无障碍返回桌面,避免 QQ 等聊天页持续停在前台后不再产生新消息通知。
|
||||||
|
|
||||||
|
### 微信 Shizuku 回复
|
||||||
|
|
||||||
|
微信新版会限制普通无障碍输入,因此微信回复必须使用 Shizuku。Android 11 及以上可按 Shizuku 页面提示通过“开发者选项 → 无线调试 → 使用配对码配对设备”启动;非 Root 启动通常会在手机重启后失效,需要重新启动 Shizuku。
|
||||||
|
|
||||||
|
GotMsg 首页应显示“Shizuku 已就绪”。若显示未授权,点击授权入口并在 Shizuku 弹窗中允许 GotMsg。
|
||||||
|
|
||||||
|
## 锁屏与 PIN 自动解锁
|
||||||
|
|
||||||
|
`RemoteInput` 通常可在锁屏状态执行;无障碍和 Shizuku 兼容回复需要进入目标应用,原手机必须先解锁。
|
||||||
|
|
||||||
|
已配置 Shizuku 的手机可在“设置 → 通知回复”中开启 PIN 自动解锁:
|
||||||
|
|
||||||
|
1. 输入原手机 4–16 位数字锁屏 PIN 并保存。
|
||||||
|
2. PIN 使用 Android Keystore AES-GCM 加密,只保存在原手机,并排除云备份和设备迁移。
|
||||||
|
3. 每个回复任务最多提交一次 PIN;失败不会自动重试,避免触发系统锁定策略。
|
||||||
|
4. 如果任务开始时手机处于锁定状态,回复完成后 GotMsg 会尝试重新锁屏。
|
||||||
|
|
||||||
|
手机重启后的第一次解锁仍必须手动完成;Shizuku 未运行时不能自动输入 PIN。图案、字母密码和生物识别不属于该功能支持范围。
|
||||||
|
|
||||||
|
## 生效条件与限制
|
||||||
|
|
||||||
|
- 回复链接从通知转发起 10 分钟内有效,并且只能成功提交一次。
|
||||||
|
- 原通知不能被划掉或被新通知替换;进程未重启时 GotMsg 会短暂缓存通知入口,降低通知更新导致的失败概率。
|
||||||
|
- 原 Android 手机必须联网,GotMsg 进程和通知监听服务需要正常工作。
|
||||||
|
- 短信 App 中识别出的验证码通知不生成回复入口;付款、订单、营销和系统通知通常也没有可回复的聊天输入框。
|
||||||
|
- 兼容回复要求通知点击后真正进入对应聊天页;联系人页、登录页、广告页等不会被当作聊天页。
|
||||||
|
- 某些 App 或定制系统不会向无障碍服务暴露聊天控件;界面更新后也可能需要重新适配。
|
||||||
|
|
||||||
|
## 常见失败
|
||||||
|
|
||||||
|
| 提示 | 处理方法 |
|
||||||
|
| --- | --- |
|
||||||
|
| `回复链接已过期` | 链接有效期为 10 分钟,等待一条新通知再试 |
|
||||||
|
| `原通知已消失` | 原通知已被清除或替换,等待新通知后再回复 |
|
||||||
|
| `请在 GotMsg 设置中开启无障碍兼容回复服务` | 同时检查应用内开关和系统“GotMsg 兼容回复”无障碍权限 |
|
||||||
|
| `Shizuku 未就绪` / `Shizuku 未授权` | 打开 Shizuku 重新启动服务,并授权 GotMsg |
|
||||||
|
| `原手机需解锁后才能回复` | 手动解锁,或配置 Shizuku PIN 自动解锁 |
|
||||||
|
| `微信未进入聊天页` | 检查点击原通知能否直接进入对应微信会话,并确认没有登录页或弹窗遮挡 |
|
||||||
|
| `未找到聊天输入框` / `未找到明确的发送按钮` | 确认进入聊天页、无障碍服务开启;目标 App 更新后可能需要重新适配 |
|
||||||
|
| `无法确认聊天输入框中的回复内容` | 常见于 QQ 等不公开输入框文本的界面;升级到最新版并保留 `A2iReply` 日志供排查 |
|
||||||
|
| `聊天输入框已有未发送内容` | GotMsg 为保护原手机草稿而停止;清空草稿后用新通知重试 |
|
||||||
|
| `原手机未确认回复` | 检查原手机网络、后台限制、通知使用权以及 GotMsg 是否仍在运行 |
|
||||||
|
|
||||||
|
## 安全说明
|
||||||
|
|
||||||
|
- 每个已创建的回复会话使用独立的 256 位随机回复令牌。令牌位于 URL fragment 中,不会随首次页面请求进入服务器访问日志。
|
||||||
|
- GotMsg 安装时生成独立设备 ID 和密钥;原手机与中继 API 之间的注册、拉取和确认请求均需设备鉴权。
|
||||||
|
- 中继只持久化设备密钥和回复令牌的 SHA-256 哈希。提交后的回复正文会短暂保存,处理完成后最多保留约 24 小时,用于状态查询和故障排查。
|
||||||
|
- 拿到有效回复链接的人可在有效期内提交一次回复,因此不要转发或公开该链接。
|
||||||
|
- 无障碍和 Shizuku 都是高权限能力,只应在你信任、由你控制的原 Android 手机上启用。
|
||||||
|
- 回复服务固定使用 `https://r.gotmsg.pp.ua`。自行部署或更换域名时,需要同步修改 `ReplyFeature.RELAY_BASE_URL` 并重新构建 APK。
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 521 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 609 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 624 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 336 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 290 KiB After Width: | Height: | Size: 562 KiB |
Reference in New Issue
Block a user