From fbc9b67b516cc27367abbf253e26d0c0fd2a485c Mon Sep 17 00:00:00 2001
From: Song <168455@qq.com>
Date: Fri, 17 Jul 2026 16:37:03 +0800
Subject: [PATCH] docs: rewrite beginner setup guide
---
README.md | 684 +++++++++++++++++++++---------------
docs/A2iReply-shortcut.md | 6 +-
docs/notification-reply.md | 111 ++++--
screenshots/home-latest.png | Bin 0 -> 637191 bytes
4 files changed, 485 insertions(+), 316 deletions(-)
create mode 100644 screenshots/home-latest.png
diff --git a/README.md b/README.md
index a7baf51..6d3054c 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,388 @@
# GotMsg · 有消息
-把安卓手机上的系统通知(短信、验证码、来电、微信、QQ、Telegram、企业微信、App 推送等)实时转发到 **iPhone、iPad、其它安卓机、鸿蒙机、桌面邮箱**,并在接收端直接**远程回复**原安卓手机。
+
+
+
-适用于把安卓备机的消息同步到主力机,不漏验证码、不漏重要聊天、不断网仍能收到关键通知。
+
+
+
+
+
+
+
-
+GotMsg 安装在一台 Android 手机上,读取这台手机收到的系统通知,再转发到 **iPhone、iPad、另一台 Android、鸿蒙手机或邮箱**。短信验证码、来电、微信、QQ、Telegram 和普通 App 通知都可以进入转发链路。
+
+除了“看通知”,GotMsg 还支持从 Bark / ntfy 通知打开一次性网页,把回复送回原 Android 手机:优先使用系统快捷回复,QQ 等 App 可走无障碍兼容回复,微信可走 Shizuku。
+
+> [!IMPORTANT]
+> GotMsg 不是聊天软件,也不会登录微信或 QQ。它处理的是 Android 通知;原 App 没有产生通知、通知内容被隐藏,或原手机被系统彻底休眠时,GotMsg 就拿不到对应内容。
+
+## 功能一览
+
+| 功能 | 状态 | 说明 |
+|---|---:|---|
+| 多通道转发 | 🟢 | Bark、ntfy、Meow、SMTP 电邮,可同时启用多条配置 |
+| 断网短信兜底 | 🟢 | 原手机断网时,用 SIM 卡短信转发验证码、来电等紧要通知 |
+| 验证码提取 | 🟢 | 识别 4–8 位验证码,可自动复制并提升重要通知级别 |
+| App 黑白名单 | 🟢 | 默认转发全部或只转发指定 App |
+| 广告与噪音过滤 | 🟢 | 内置规则、自定义关键词、常驻通知过滤和 5 秒去重 |
+| 来电与未接来电 | 🟢 | 兼容 MIUI / HyperOS;有权限时补充号码和联系人姓名 |
+| 远程回复 | 🟢 | Android `RemoteInput`、无障碍兼容回复、微信 Shizuku 回复 |
+| 锁屏 PIN 自动解锁 | 🟡 可选 | 仅 Shizuku 已运行时;PIN 用 Android Keystore 加密保存,每次最多尝试一次 |
+| 自动更新 | 🟢 | Gitea 优先、GitHub 备用;自动选择当前手机适配的 APK |
+| 日志与失败重试 | 🟢 | 最近 300 条处理记录;发送失败进入待重发队列 |
+
+## 目录
+
+- [先看懂两台手机的角色](#先看懂两台手机的角色)
+- [需要安装哪些 App](#需要安装哪些-app)
+- [十分钟上手](#十分钟上手)
+- [推送通道详细配置](#推送通道详细配置)
+- [远程回复详细教程](#远程回复详细教程)
+- [权限和后台保活](#权限和后台保活)
+- [过滤、来电、图标和更新](#过滤来电图标和更新)
+- [常见问题排查](#常见问题排查)
+- [界面截图](#界面截图)
+- [隐私与安全](#隐私与安全)
---
-## 交流群
+## 先看懂两台手机的角色
-使用中遇到配置、转发或远程回复问题,可以扫码加入 QQ 群交流。
+| 名称 | 是哪台设备 | 要做什么 |
+|---|---|---|
+| **原手机 / 发送端** | 收到短信、微信、QQ 等通知的 Android 手机 | 安装 GotMsg,授予通知读取权限,保持联网和后台运行 |
+| **接收端** | 你随身使用的 iPhone、iPad、Android、鸿蒙手机或电脑 | 根据通道安装 Bark、ntfy、Meow,或直接收邮件 / 短信 |
+
+举例:一台放在家里的小米 Android 手机插着银行卡手机号,你日常使用 iPhone。GotMsg 安装在小米手机,Bark 安装在 iPhone。
+
+> [!WARNING]
+> 不要把 GotMsg 只安装在接收端。GotMsg 必须安装在“实际收到原始通知”的 Android 手机上。
+
+## 需要安装哪些 App
+
+### 原 Android 手机上
+
+| App | 是否必须 | 用途 | 安装来源 |
+|---|---:|---|---|
+| **GotMsg** | 必须 | 读取、过滤和转发通知 | [本仓库 Releases](../../releases) |
+| **Shizuku** | 仅微信回复 / PIN 自动解锁需要 | 以 ADB shell 权限操作微信输入、发送和锁屏 PIN | [Shizuku 官网](https://shizuku.rikka.app/download/) / [GitHub Releases](https://github.com/RikkaApps/Shizuku/releases) |
+
+QQ、支付宝、淘宝和钉钉的兼容回复依赖 Android 系统自带的**无障碍服务**,不需要另外安装无障碍 App。
+
+### 接收端
+
+| 接收端 | 推荐方案 | 需要安装 |
+|---|---|---|
+| iPhone / iPad | **Bark** | [App Store](https://apps.apple.com/app/bark-custom-notifications/id1403753865) |
+| Android | **ntfy** | [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) / [F-Droid](https://f-droid.org/packages/io.heckel.ntfy/) / [GitHub](https://github.com/binwiederhier/ntfy/releases) |
+| iPhone(也想用 ntfy) | ntfy | [App Store](https://apps.apple.com/us/app/ntfy/id1625396347) |
+| 鸿蒙 / HarmonyOS | **Meow** | 从你使用的 Meow 项目或服务提供方安装;需要能取得推送接口和 Device Key / Token |
+| 电脑、平板 | 电邮 | 不需要专用 App,使用现有邮件客户端即可 |
+| 任意手机 | 断网短信兜底 | 不需要额外 App,使用系统短信应用接收 |
+
+打开远程回复网页只需要普通浏览器,不需要 iOS 快捷指令,也不需要额外的 `_reply` topic。
+
+---
+
+## 十分钟上手
+
+### 第 1 步:下载并安装 GotMsg
+
+1. 在原 Android 手机上打开 [Releases](../../releases)。
+2. 不知道手机架构时,下载文件名带 **`universal`** 的 APK,兼容性最好。
+3. 大多数近年的 Android 手机是 ARM64,也可以下载 **`arm64-v8a`**,体积略小。
+4. 浏览器提示“禁止安装未知应用”时,进入系统提示页,只允许当前浏览器或文件管理器完成这一次安装。
+5. 安装完成后打开 GotMsg。
+
+系统要求:**Android 14 / API 34 或更高版本**。低于 Android 14 无法安装。
+
+### 第 2 步:先配置一个接收通道
+
+第一次使用最推荐:
+
+- iPhone / iPad:选 **Bark**。
+- Android:选 **ntfy**。
+- 鸿蒙:选 **Meow**。
+- 只想在电脑查看:选 **电邮**。
+
+进入 GotMsg 底部 **设置**,找到相应通道,先按下方教程添加配置,再点击该配置右侧的发送按钮测试。接收端收到“GotMsg 测试”才算配置成功。
+
+### 第 3 步:授予通知读取权限
+
+1. 回到 GotMsg **首页**。
+2. 点击“需要授权通知监听”或“前往系统授权”。
+3. 在系统“设备和应用通知 / 通知使用权 / 通知访问”页面找到 GotMsg。
+4. 打开允许开关并确认风险提示。
+5. 返回 GotMsg,首页应显示 **“通知监听已开启 / 已授权”**。
+
+这项权限是核心权限;普通“允许 GotMsg 自己弹通知”不能代替通知读取权限。
+
+### 第 4 步:开启转发并实测
+
+1. 首页打开 **通知转发**。
+2. 用另一台手机给原手机发一条短信或聊天消息。
+3. 接收端应在几秒内收到对应通知。
+4. 如果没有收到,先打开 GotMsg **首页 → 查看转发日志**,日志会说明是已发送、被过滤还是发送失败。
+
+### 第 5 步:设置后台运行
+
+完成基础测试后,务必按[权限和后台保活](#权限和后台保活)设置自启动、后台无限制和省电白名单,否则锁屏一段时间后可能停止转发。
+
+---
+
+## 推送通道详细配置
+
+各通道都支持添加多条配置、单独启停和排序;Bark、ntfy、Meow 和电邮配置还可单独发送测试。“首个成功即止”适合相同通道的备用目标;关闭后会向该通道所有已启用配置广播。
+
+### Bark:发送到 iPhone / iPad
+
+1. 在 iPhone / iPad 安装 [Bark](https://apps.apple.com/app/bark-custom-notifications/id1403753865)。
+2. 第一次打开 Bark 时允许通知。
+3. Bark 首页会显示类似 `https://api.day.app/xxxxxxxx` 的推送地址,复制它。
+4. 原 Android 手机打开 GotMsg → **设置 → Bark 服务器 → 添加**。
+5. 按下面填写:
+
+ | 字段 | 填写内容 |
+ |---|---|
+ | 名称 | 自定义,例如“我的 iPhone” |
+ | 服务器地址 | 官方服务填 `https://api.day.app`,不要带最后的 Device Key |
+ | Device Key | Bark 地址最后 `/` 后面的字符串 |
+
+6. 保存后点击配置右侧的发送按钮。
+7. iPhone 收到“GotMsg 测试”即成功。
+
+远程回复启用后,点击 Bark 通知会进入 GotMsg 回复网页。为避免重复,回复地址不再同时显示在通知正文里。
+
+### ntfy:发送到 Android / iOS / 网页
+
+1. 在接收端安装 ntfy:Android 可用 [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy)、[F-Droid](https://f-droid.org/packages/io.heckel.ntfy/) 或 [GitHub Releases](https://github.com/binwiederhier/ntfy/releases);iPhone 使用 [App Store](https://apps.apple.com/us/app/ntfy/id1625396347)。
+2. 打开 ntfy,添加一个订阅。
+3. 官方服务器填写 `https://ntfy.sh`。
+4. Topic 使用一串不容易猜到的随机名称,例如 `gotmsg_7f3a9c2e`。
+5. 原 Android 手机打开 GotMsg → **设置 → ntfy 转发 → 添加**。
+6. 服务器和 Topic 必须与接收端完全一致;Token 只有在自建 ntfy 并开启鉴权时才填写。
+7. 保存并发送测试。
+
+> [!CAUTION]
+> `ntfy.sh` 的公共 Topic 类似“知道名字就能进入的房间”。不要使用手机号、姓名、邮箱或 `test` 这类容易猜到的 Topic。需要更强隐私时请自建 ntfy 并启用访问控制。
+
+远程回复启用后,ntfy 通知会带“回复”动作,点击通知也会进入回复页;正文不再重复附加相同链接。
+
+### Meow:发送到鸿蒙手机
+
+Meow 不是 GotMsg 内置组件,需要先在鸿蒙手机上安装并完成 Meow 自身的推送注册。不同 Meow 服务的分发方式和接口格式可能不同,请以你所使用的 Meow 项目说明为准。
+
+1. 在鸿蒙手机打开 Meow,确认它能正常接收测试推送。
+2. 在 Meow 中找到完整推送接口 / 服务器地址和 Device Key / Token。
+3. GotMsg → **设置 → Meow 转发 → 添加**。
+4. 名称用于区分设备;服务器填写 Meow 给出的地址;Device Key 填 Meow 的设备 Key。
+5. 保存后发送测试。
+
+不要在 Device Key 中填写鸿蒙锁屏密码、华为账号密码或短信验证码。
+
+### SMTP 电邮
+
+GotMsg 直接连接 SMTP 服务器发送邮件。QQ 邮箱、163、Gmail、Outlook 等通常需要先在邮箱安全设置里开启 SMTP,并生成**授权码 / 应用专用密码**,不建议直接填写网页登录密码。
+
+| 字段 | 示例 |
+|---|---|
+| SMTP 主机 | `smtp.qq.com`、`smtp.163.com`、`smtp.gmail.com` |
+| 端口 | 国内邮箱通常用 `465`(隐式 SSL) |
+| 账号 | 完整邮箱地址 |
+| 授权码 / 密码 | 邮箱后台生成的 SMTP 授权码 |
+| 发件人 | 通常与账号一致 |
+| 收件人 | 实际接收通知的邮箱 |
+
+保存后务必发送测试。如果超时,先检查端口、授权码、运营商网络是否拦截 SMTP。
+
+### 断网短信兜底
+
+该功能在原 Android 手机**没有网络**时,用原手机 SIM 卡发送短信,因此会消耗短信套餐。
+
+1. GotMsg → **设置 → 断网短信兜底**,授予“发送短信”权限。
+2. 添加接收手机号并启用。
+3. 默认“仅紧要通知”只发送验证码和来电;关闭后会尝试发送全部通知。
+4. 建议保持限频,例如每 5 分钟最多 1 条。
+5. 开启余额检查后,余额低于或等于 5 时自动挂起;也可以使用手动短信额度。
+
+> [!WARNING]
+> 短信兜底不是普通在线转发通道。手机有网络时,通知仍走 Bark、ntfy、Meow 或邮件。
+
+---
+
+## 远程回复详细教程
+
+### 回复链路
+
+1. 原手机收到通知并转发到 Bark / ntfy。
+2. 接收端点击通知或“回复”动作,打开 `https://r.gotmsg.pp.ua`。
+3. 页面显示原通知的应用、标题和正文,输入回复内容并提交。
+4. 原手机上的 GotMsg 拉取任务并执行回复。
+5. 页面显示成功或具体失败原因。
+
+链接从通知转发起 **10 分钟内有效**,并且只允许成功提交一次。当前 Bark / ntfy 转发通知都会生成回复入口;如果原通知既没有系统快捷回复,也不属于兼容白名单,页面会明确返回不支持,而不会盲目操作原 App。
+
+### 三种回复方式
+
+| 方式 | 典型 App | 原手机额外要求 | 是否打开聊天页 |
+|---|---|---|---:|
+| Android `RemoteInput` | Telegram、WhatsApp、Signal、部分短信和企业 IM;以该条通知实际提供的动作为准 | 无 | 否 |
+| 无障碍兼容回复 | QQ、支付宝、淘宝、钉钉 | 开启 GotMsg 兼容回复无障碍服务 | 是 |
+| Shizuku 回复 | 微信 | 安装并启动 Shizuku,授权 GotMsg | 是 |
+
+同一个 App 并非所有通知都支持快捷回复:聊天通知可能支持,登录、营销、付款、订单和系统通知通常不支持。
+
+### QQ、支付宝、淘宝、钉钉:开启无障碍兼容回复
+
+1. GotMsg → **设置 → 通知回复**。
+2. 打开 **无障碍兼容回复**。
+3. 系统跳到无障碍页面后,找到 **GotMsg 兼容回复**。
+4. 阅读系统提示并启用服务。
+5. 返回 GotMsg,确认开关仍开启。
+
+执行时 GotMsg 会打开原通知对应的聊天页,拒绝覆盖已有草稿,只点击文字明确匹配“发送”的控件。回复结束后:有 Shizuku 时切回 GotMsg;无 Shizuku 时用无障碍返回桌面,避免 QQ 等聊天页停留前台后不再弹新通知。
+
+### 微信:安装和启动 Shizuku
+
+微信新版会屏蔽普通无障碍输入,因此微信回复必须使用 Shizuku。
+
+1. 从 [Shizuku 官网](https://shizuku.rikka.app/download/) 或 [GitHub Releases](https://github.com/RikkaApps/Shizuku/releases) 安装 Shizuku。
+2. Android 11 及以上推荐在 Shizuku 内按提示使用“无线调试”启动:
+ - 系统设置 → 关于手机,连续点击版本号,打开开发者选项;
+ - 开发者选项 → 无线调试;
+ - 在 Shizuku 中选择配对,按页面提示输入系统配对码;
+ - 配对完成后回到 Shizuku 点击启动。
+3. 打开 GotMsg 首页,Shizuku 状态卡应显示 **“Shizuku 已就绪”**。
+4. 如果显示“未授权”,点击 **授权 Shizuku**,并在 Shizuku 弹窗中允许 GotMsg。
+5. GotMsg → **设置 → 通知回复**,打开“无障碍兼容回复”总开关。微信实际执行走 Shizuku;仅为了微信时可以不启用系统无障碍服务。
+
+非 Root 方式启动的 Shizuku 在手机重启后通常需要重新启动。GotMsg 首页会直接显示当前状态。
+
+### 可选:Shizuku PIN 自动解锁
+
+适合原手机平时锁屏放置、希望收到远程回复后自动亮屏执行的场景。
+
+1. 确认 Shizuku 已就绪。
+2. GotMsg → **设置 → 通知回复**。
+3. 输入原手机 4–16 位数字锁屏 PIN,点击“保存并启用”。
+4. PIN 使用 Android Keystore AES-GCM 加密,仅保存在原手机,并排除云备份和设备迁移。
+5. 每个回复任务最多提交一次 PIN;失败不会自动重试,避免触发系统锁定策略。
+
+限制:手机重启后的第一次解锁仍必须手动完成;Shizuku 未运行时不能自动输入 PIN;图案、字母密码和生物识别不能代替这里的数字 PIN。
+
+完整技术说明和错误含义见 [通知远程回复文档](docs/notification-reply.md)。
+
+---
+
+## 权限和后台保活
+
+### 权限用途
+
+| 权限 / 系统服务 | 是否必须 | 用途 |
+|---|---:|---|
+| 通知使用权 / 通知访问 | **必须** | 读取原手机上的系统通知 |
+| 网络 | **必须** | 发送到各在线通道、检查更新和远程回复 |
+| GotMsg 自身通知 | 建议 | 显示状态和更新提醒;不能代替通知使用权 |
+| 电话 | 使用来电功能时 | 读取电话状态 |
+| 通话记录 | 使用未接来电时 | 通话结束后查找未接号码 |
+| 联系人 | 希望显示联系人姓名时 | 用号码反查本地联系人 |
+| 发送短信 | 使用断网兜底时 | 从原手机 SIM 卡发送短信 |
+| 无障碍 | 使用 QQ 等兼容回复时 | 找输入框、写入回复、点击发送和返回桌面 |
+| Shizuku | 使用微信回复 / PIN 解锁时 | 以 ADB shell 权限执行输入、剪贴板、点击和锁屏操作 |
+| 安装未知应用 | App 内更新时 | 下载完成后调起系统安装器 |
+
+### 防止锁屏后停止转发
+
+不同品牌名称不同,目标都是让 GotMsg 可以长期在后台运行:
+
+1. 系统设置 → 应用 → GotMsg → 电池 / 耗电管理 → 选择**无限制 / 不优化**。
+2. 在系统“自启动 / 后台启动 / 关联启动”里允许 GotMsg。
+3. 最近任务界面如果支持“锁定应用”,锁定 GotMsg。
+4. 不要使用一键清理、深度省电或第三方管家强制结束 GotMsg。
+5. 修改权限或系统升级后,回到首页确认“通知监听已开启”。
+
+小米 / HyperOS 常见路径:设置 → 应用设置 → 应用管理 → GotMsg → 省电策略 → 无限制,并允许自启动。三星常见路径:设置 → 电池 → 后台使用限制 → 从深度休眠应用中移除。
+
+---
+
+## 过滤、来电、图标和更新
+
+### 应用黑白名单
+
+- **黑名单模式**:默认转发所有 App,只排除你不想转发的 App;适合大多数人。
+- **白名单模式**:默认不转发,只允许勾选的 App;适合只收短信验证码或少数聊天 App。
+
+### 过滤与验证码
+
+“过滤”页可控制持续通知、验证码提取、广告过滤和特殊 App 优化。内置规则会过滤 VPN / 代理常驻通知、系统“正在运行”、近空内容和泛化“你有一条新消息”等噪音;用户可继续添加自定义广告关键词。
+
+每条通知在 5 秒窗口内去重。微信、QQ、Telegram 会进行专门解析;验证码可自动复制,重要通知会提高推送级别。
+
+### 来电和未接来电
+
+MIUI / HyperOS 经常不把系统电话通知交给第三方监听器。GotMsg 会额外轮询电话状态:
+
+- 来电时推送“有电话进来”;无障碍若能读取来电界面,可补充号码。
+- 通话结束后读取通话记录,识别未接号码;有联系人权限时显示姓名。
+
+### 应用图标
+
+在 **设置 → 应用图标** 填写公网图标 URL 前缀,并把已安装 App 图标导出到选定目录。上传后,GotMsg 按 `URL 前缀 + 包名 + .png` 生成通知图标地址。留空则不附加自定义图标。
+
+### 应用内更新
+
+- 启动约 5 秒后检查一次,之后每 24 小时巡检。
+- 同时查询 Gitea 和 GitHub;同版本优先 Gitea,取两边可用的最高版本。
+- 升级弹窗只显示当前目标版本和本次发版说明,不再展示一长串 ABI 安装包。
+- App 自动选择当前手机 ABI,对应包不存在时使用 universal。
+- 安装前 Android 会要求允许 GotMsg“安装未知应用”。
+
+---
+
+## 常见问题排查
+
+| 现象 / 报错 | 处理方法 |
+|---|---|
+| 完全没有转发 | 首页确认“通知监听已开启”和“通知转发”已打开;再检查至少一个通道配置已启用 |
+| 测试推送成功,锁屏后不再转发 | 设置电池无限制、自启动和最近任务锁定;检查系统是否撤销通知使用权 |
+| 日志显示“已过滤” | 点开该条日志查看原因;检查黑白名单、广告关键词、持续通知和特殊 App 规则 |
+| Bark 收不到 | 检查服务器地址不要带 Device Key;Device Key 不要漏字符;暂时关闭 VPN / 代理测试 |
+| ntfy 收不到 | 接收端与 GotMsg 的服务器和 Topic 必须完全一致;确认 ntfy App 允许通知和后台运行 |
+| Meow 收不到 | 先确认 Meow 自身能收测试;检查完整接口地址和 Device Key / Token |
+| 邮件发送失败 | 使用 SMTP 授权码而不是网页登录密码;检查 465/SSL、发件人和网络限制 |
+| 回复链接已过期 | 链接有效期 10 分钟;等待一条新通知再回复 |
+| 原通知已消失 | 不要划掉原手机通知;等待新通知重新生成会话 |
+| 微信提示 Shizuku 未就绪 | 打开 Shizuku 重新启动服务并授权 GotMsg;重启手机后通常需要重新启动 Shizuku |
+| 微信未进入聊天页 | 确认通知点击本身能打开对应聊天,而不是联系人页、登录页或广告页 |
+| QQ 找不到输入框 / 发送按钮 | 确认系统无障碍服务已开启;QQ 界面升级后可能需要重新适配,请保留 `A2iReply` 日志 |
+| 原手机设置了 PIN | 配置 Shizuku PIN 自动解锁,或先手动解锁再回复;首次开机解锁不能自动完成 |
+| 输入框已有草稿 | GotMsg 为避免覆盖原内容会主动停止;先在原手机处理草稿 |
+| 下载后不能安装更新 | 系统设置 → 特殊应用权限 → 安装未知应用 → 允许 GotMsg |
+
+日志页保存最近 300 条处理记录。发送失败会进入“待重发”,联网后由系统后台任务继续尝试。
+
+---
+
+## 界面截图
+
+原 README 首图 `overview.png` 已移动到本节,作为多通道设置界面展示。
+
+| 多通道设置 | 应用管理 | 过滤设置 |
+|---|---|---|
+|  |  |  |
+
+| 设置 | 转发日志 |
+|---|---|
+|  |  |
+
+---
+
+## QQ 交流群
+
+配置、转发或远程回复遇到问题,可扫码加入 QQ 群。反馈回复问题时,建议同时提供 GotMsg 版本、手机型号、Android 版本、目标 App 版本和日志中的完整报错。
@@ -18,162 +390,32 @@
---
-## 一、五分钟上手
+## 隐私与安全
-### 1. 安装
-从 [Releases](../../releases) 下载最新 APK,安装到**需要被转发的安卓手机**(需 Android 14 / API 34+)。Release 同时提供 universal 全架构包和 arm64-v8a / armeabi-v7a / x86 / x86_64 单架构包,App 内更新页会默认选中与你设备最匹配的版本。
+### 通知内容会经过哪里
-### 2. 选一个推送通道
-推荐三选一:
+- Bark、ntfy、Meow、SMTP 或短信服务需要接收你选择转发的通知内容;使用公共服务前请阅读对应服务的隐私政策。
+- 开启远程回复后,GotMsg 会把应用名、通知标题和正文注册到 `https://r.gotmsg.pp.ua`,用于回复页预览;回复正文也会经过该中继。
+- 回复链接包含一次性能力令牌。令牌放在 URL fragment 中,首次网页请求不会把它写入服务器访问日志;不要把有效回复链接转发给别人。
+- 中继保存设备鉴权哈希、通知预览、会话状态和短期回复任务;等待中的会话过期后清理,已处理状态和回复最多保留约 24 小时用于结果查询与排错。
-| 接收设备 | 推荐通道 | 难度 |
-|---|---|---|
-| iPhone / iPad | **Bark** | ⭐ 最简单 |
-| 安卓手机 | **ntfy** | ⭐ 推荐开源 |
-| 鸿蒙手机 | **Meow** | 鸿蒙专属 |
-| 任何能收邮件的设备 | **电邮** | 桌面/平板可用 |
+### 技术统计
-打开 GotMsg -> 「设置」-> 选对应通道 -> 点右上角 **i** 按钮 -> 按弹窗步骤配 -> 点该行「发送」测试。可以**同时启用多个通道**,所有勾选的会并行收到。
+当前版本会向项目自有的 `https://stats.gotmsg.pp.ua/v1/events` 发送安装、启动和各通道成功 / 失败等技术统计,包括随机安装 ID、Android ID、会话 ID、App 版本、Android 版本、厂商型号、语言地区、时区、网络类型、通道、状态和精简失败原因。统计事件不包含通知标题、通知正文、回复正文、Bark Key、ntfy Token、邮箱授权码或锁屏 PIN。
-### 3. 授权通知监听
-首页会提示「需要授权通知监听」。点击「前往系统授权」,在系统的通知访问设置中开启 GotMsg。
+### 本地敏感数据
-### 4. 开启转发
-首页打开「通知转发」开关。安卓收到通知后按配置自动推送到各通道。**发现新版时也会自动把更新通知推给所有已启用的通道**,不用进 App 也能升级。
+- Bark Key、ntfy Token、SMTP 配置等保存在 Android 应用私有存储中,请保护原手机锁屏和系统账号。
+- Shizuku 自动解锁 PIN 使用 Android Keystore AES-GCM 加密,且排除云备份与设备迁移;关闭功能后可在设置中删除 PIN。
+- 无障碍和 Shizuku 权限能力较高,只应在你信任、由你控制的原 Android 手机上启用。
---
-## 二、推送通道配置详解
+
+高级用户:自建 Bark / ntfy
-每条配置都可独立勾选/删除/排序/测试。点「添加」时建议每条都先「发送」测试一次。
+### Bark Server
-### 2.1 Bark(iOS / iPadOS)
-
-[Bark](https://github.com/Finb/Bark) 是 iOS 上最轻量的推送方案,复制地址即用,**推荐所有 iOS 用户首选**。
-
-**配置步骤**:
-1. iPhone / iPad 上安装 Bark,首次打开允许通知权限。
-2. 复制 Bark 首页的推送地址,形如 `https://api.day.app/你的Key`。
-3. GotMsg「设置 -> Bark 服务器 -> 添加」:
- - **名称**:随意,例如「我的 iPhone」
- - **服务器地址**:`https://api.day.app`(自建则填自建地址)
- - **Device Key**:Bark 地址中 `/` 后面的那段
-4. 保存后点「发送」测试;iPhone 收到「GotMsg 测试」即成功。
-5. 多台 iOS 设备:可继续添加多条 Bark 配置,每条独立勾选;列表顺序即推送顺序,可开启「首个成功即止」或全部广播。
-
-**为什么推荐 Bark**:iOS 上点击 Bark 通知体验最自然;通知附带 GotMsg 回复链接,可从 iPhone 直接回复原安卓;Bark 服务器在中国大陆可直接访问。
-
-### 2.2 ntfy(Android / iOS / 网页)
-
-[ntfy](https://ntfy.sh) 是开源的 HTTP pub-sub 通知服务,**支持 Android、iOS 和网页端**,无需注册项目。
-
-**配置步骤**:
-1. 接收端安装 ntfy:
- - Android:[Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) / [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/) / [GitHub](https://github.com/binwiederhier/ntfy)
- - iOS:[App Store](https://apps.apple.com/us/app/ntfy/id1625396347)
-2. 打开 ntfy -> 添加订阅。服务器填 `https://ntfy.sh`(或自建地址);Topic 用一串**随机难猜的名字**(如 `gotmsg_a8f3d2`)。
-3. GotMsg「设置 -> ntfy 转发 -> 添加」:
- - **服务器**:与接收端完全一致
- - **Topic**:与接收端完全一致
- - **Token**:仅自建服务且启用了鉴权时填
-4. 保存后点「发送」测试;接收端收到「GotMsg 测试」即成功。
-
-> **安全提示**:公共 topic 谁知道名字就能订阅或发送。Topic 名**不要用**手机号、姓名、邮箱等可猜信息。
->
-> **远程回复**:GotMsg 在转发聊天类通知时,会**自动给 ntfy 通知挂上「View」动作按钮和正文中的回复链接**。iOS 上点通知本体只能进 ntfy App,要回复请点动作按钮或正文里的回复链接。
-
-### 2.3 Meow(鸿蒙 / HarmonyOS)
-
-Meow 是鸿蒙手机的推送接收方案。GotMsg 按你填写的 Meow 接口地址和 Device Key 发出 HTTP 请求即可。
-
-**配置步骤**:
-1. 鸿蒙手机上安装 Meow,确认 Meow 自身能正常接收推送。
-2. 在 Meow 里找到**推送接口地址**和对应的 **Device Key / Token**。
-3. GotMsg「设置 -> Meow 转发 -> 添加」:
- - **名称**:按鸿蒙设备填写(方便区分多台)
- - **服务器地址**:Meow 给出的完整 API 地址
- - **Device Key**:Meow 给你的设备 Key(**不是**鸿蒙锁屏密码、华为账号密码)
-4. 保存后点「发送」测试;鸿蒙手机收到「GotMsg 测试」即成功。
-
-> 失败排查:检查 Meow 接口地址是否完整、Key 是否复制完整、鸿蒙手机是否允许 Meow 通知。
-
-### 2.4 电邮转发
-
-通过 SMTP 把通知发到邮箱(**适合无手机接收的场景**,如仅在桌面/平板查看)。GotMsg **直连 SMTP**,不依赖外部邮件服务。
-
-**配置步骤**:
-1. 准备一个 SMTP 邮箱(QQ/163/Gmail/Outlook 都可),**开启 SMTP 服务并生成授权码**(不是登录密码)。
- - QQ:设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> 开启 SMTP -> 生成授权码
- - 163:设置 -> POP3/SMTP/IMAP -> 开启 SMTP -> 设置授权码
- - Gmail:账户 -> 安全性 -> 两步验证 -> 应用专用密码
-2. GotMsg「设置 -> 电邮转发 -> 添加」:
- - **服务器(SMTP 主机)**:`smtp.qq.com` / `smtp.163.com` / `smtp.gmail.com` 等
- - **端口**:`465`(推荐,隐式 SSL)
- - **账号**:完整邮箱地址
- - **授权码 / 密码**:上一步生成的授权码
- - **发件人**:通常与账号相同
- - **收件人**:接收通知的目标邮箱
-3. 保存后点「发送」测试;收件人收到「GotMsg 测试」即成功。
-
-> **国内邮箱推荐端口 465**(QQ/163 均支持)。Gmail 需要应用专用密码而不是账户密码。
-
-### 2.5 断网短信兜底
-
-**当安卓手机没有网络时**,把重要通知(验证码、来电)通过 **SIM 卡短信** 发到另一台手机(通常是你的 iPhone)。需要安卓卡里还有短信套餐余量。
-
-**配置步骤**:
-1. 在 GotMsg「设置 -> 短信兜底」点「授予短信权限」(安卓系统权限)。
-2. 点「添加」输入**目标手机号**(如 iPhone 号,接收端是另一台手机,**不是** GotMsg 本身)。
-3. 选运营商:
- - 选了「自动识别」:GotMsg 会发免费查询短信给运营商服务号,解析回执获取余量。回执短信本身会被识别并拦截,不转发。
- - 选了「手动额度」:在「手动短信额度」填入当前套餐短信条数,每次发短信后自动减 1。
-4. 当余量 ≤ 5 时自动暂停,下次打开 App 提醒续费。
-5. 频率限制:每 5 分钟最多发 1 条(避免刷屏),同一条通知 5 分钟内不重复。
-
-> **适用场景**:安卓手机没 WiFi 时,验证码不会丢,漏不了重要登录。
-
----
-
-## 三、通知远程回复(Bark / ntfy)
-
-GotMsg v1.11.0 起,Bark 和 ntfy 转发通知会附带回复入口,接收端在 iPhone 或 Android 上打开回复页输入内容后,回复会经 **GotMsg 中继(`https://r.gotmsg.pp.ua`)送回原 Android 手机**。GotMsg 优先使用原通知的 Android `RemoteInput` 快捷回复能力;微信等没有 `RemoteInput` 的 App 走无障碍兼容回复;微信 8.0.49+ 进一步屏蔽无障碍时,可启用 **Shizuku 路径**直接调用 `input` 命令绕过。
-
-### 3.1 三种回复路径
-
-| 路径 | 适用 | 是否需要解锁原手机 | 额外授权 |
-|---|---|---|---|
-| **原生 RemoteInput** | 短信、WhatsApp、企业 IM、Telegram 等暴露系统回复动作的 App | 否(后台执行) | 无 |
-| **无障碍兼容回复** | QQ、支付宝、淘宝、钉钉 | 是 | 「GotMsg 兼容回复」无障碍服务 |
-| **Shizuku 兼容回复(仅微信)** | 微信(绕过无障碍屏蔽) | 是 | Shizuku 已启动并授予 GotMsg 权限 |
-
-### 3.2 启用方式
-
-1. **Bark / ntfy 接收端**:无需任何额外配置。GotMsg 自动在通知正文或 ntfy 动作按钮里附上回复链接。
-2. **原 Android 手机**:
- - 默认即可使用 `RemoteInput`(无需任何操作)。
- - 想在没有 `RemoteInput` 的 App 上回复,进入「设置 -> 通知回复」打开「无障碍兼容回复」,再到系统无障碍设置里启用「GotMsg 兼容回复」服务。
- - 想在最新版微信上回复,启用 **Shizuku**(在 GitHub Releases 下载并启动),GotMsg 首页会显示 Shizuku 状态卡片;点击「授权 Shizuku」即可。微信路径会自动以 Shizuku 身份模拟 `input tap` 聚焦输入框、写剪贴板、`KEYCODE_PASTE` 注入任意 Unicode,并通过截图像素扫描识别微信绿色发送按钮。
-
-### 3.3 使用流程
-
-- Bark:通知点击目标会优先变成回复页,正文也会附带回复链接;普通消息不会再跳微信/QQ 等原 App。
-- ntfy:通知附带 View 动作按钮和正文中的回复链接;iOS 上点通知本体只进入 ntfy App,请点动作按钮或正文里的回复链接。
-
-完整使用方法与限制见 [docs/notification-reply.md](docs/notification-reply.md)。接收端不需要安装 iOS 快捷指令,也不需要订阅额外的 `_reply` topic(旧版方案已移除,见 [docs/A2iReply-shortcut.md](docs/A2iReply-shortcut.md))。
-
-> 链接 10 分钟内有效,只能成功提交一次。原生快捷回复可在后台执行;无障碍 / Shizuku 兼容回复会亮屏并打开原 App;自动解锁仅对**无密码滑动锁**有效,密码 / PIN / 指纹锁需手动解锁一次;完成后会**自动重新锁屏**。付款、订单、营销等非聊天通知不能回复。
-
----
-
-## 四、自建推送服务(可选)
-
-所有通道都支持自建,更好、更私密、可控。
-
-### 4.1 自建 Bark 服务器
-
-GotMsg 默认用 Bark 官方服务器(`https://api.day.app`),免费够用。自建适合追求完全控制。
-
-**Docker 一键部署**(推荐):
```bash
docker run -d --name bark --restart=unless-stopped \
-p 8080:8080 \
@@ -181,13 +423,9 @@ docker run -d --name bark --restart=unless-stopped \
finab/bark-server
```
-然后用 Nginx Proxy Manager 加 HTTPS 域名。详细三种方案对比请看 [Bark 官方文档](https://github.com/Finb/Bark)。
+用 Nginx / Caddy 配置 HTTPS 后,GotMsg 的服务器地址填写站点根地址,不要追加 `/push`。详情见 [Bark 文档](https://bark.day.app/#/) 和 [Bark GitHub](https://github.com/Finb/Bark)。
-**GotMsg 配置**:服务器地址填 `https://你的域名.com`(不要 `/push` 后缀),Device Key 填你在自建 Bark 上创建的 Key。
-
-### 4.2 自建 ntfy 服务器
-
-[ntfy](https://ntfy.sh) 是为自建设计的,**比 Bark 还简单**——官方直接提供 Docker 一行启动:
+### ntfy Server
```bash
docker run -d --name ntfy --restart=unless-stopped \
@@ -196,133 +434,13 @@ docker run -d --name ntfy --restart=unless-stopped \
binwiederhier/ntfy serve
```
-推荐加 Nginx 反代上 HTTPS 域名。完整文档:[docs.ntfy.sh](https://docs.ntfy.sh/install/)。
+生产使用建议配置 HTTPS、缓存文件和访问控制。详情见 [ntfy 安装文档](https://docs.ntfy.sh/install/)。
-**GotMsg 配置**:服务器地址填 `https://ntfy.你的域名.com`,Topic 照旧。
+
-### 4.3 自建 Meow 服务器
-Meow 是鸿蒙客户端,服务端一般用 Meow 自带的。GotMsg 端无需配置服务端,只需填 Meow 给你的接口地址 + Key。
+## 发布与许可
----
-
-## 五、应用内更新
-
-GotMsg 内置更新检测:定期拉取 Gitea + GitHub Releases,**发现新版时自动向所有已启用通道推送一条更新通知**(带当前版本号、目标版本号、变更摘要、APK 大小)。首页显示醒目横幅,可选「立即下载」或「忽略此版本」。
-
-下载页会**默认选中匹配你设备 ABI 的 APK**(universal / arm64-v8a / armeabi-v7a / x86_64 / x86),也可手动切换架构;下载完成后通过 `FileProvider` 调起系统安装器。
-
-Gitea 源为主(国内可达),GitHub 为兜底;主源下载失败会自动尝试另一个源的同版本链接。
-
-> 取消自动检查:在「设置 -> 应用内更新」关闭「更新检查」即可,手动检查仍可用。
-
----
-
-## 六、来电与未接来电
-
-MIUI / HyperOS 不向第三方监听器分发系统电话通知。GotMsg 通过 **轮询 `TelephonyManager.getCallState()`** 绕过此限制:
-
-- **来电**:构造「有电话进来」推送(Android 14+ 禁止第三方读取实时号码);如无障碍服务读到号码则展示真实号码。
-- **未接来电**:通话结束后查系统 `CallLog` 获取号码,并通过 `ContactsContract.PhoneLookup` 反查**联系人姓名**,推送形如「张三\n138xxxx」。
-
-需要在系统设置中授予「电话」权限(设置 -> 应用 -> GotMsg -> 权限 -> 电话)。
-
----
-
-## 七、过滤与噪音控制
-
-通知处理流水线(在 `NotificationProcessor` 中按顺序执行):
-
-1. 全局开关
-2. 持续性通知(ongoing)静默
-3. VPN / 代理客户端(Surfboard、Clash Meta、Clash for Android、v2rayNG、小米设备互联)常驻通知静默
-4. 米家「设备状态」泛化通知静默(门锁 / 告警等具体事件仍正常转发)
-5. App 黑/白名单
-6. 空内容 / 脱敏内容
-7. 噪音包名(三星剪贴板 / 键盘、GMS、SystemUI、Google 输入法)
-8. 系统状态消息("正在运行"等)
-9. **泛化无意义通知**(标题「新消息」+ 正文「你有一条新消息」等占位文案)静默
-10. 近空内容(纯符号 / 纯空格 / 仅 App 名)
-11. 广告过滤(内置营销关键词 + 用户自定义关键词)
-12. 已发短信(仅收不发)
-13. 运营商余额回执拦截(解析余量后不转发)
-14. 去重检查(5 秒窗口)
-15. 验证码提取(关键词 + 数字 / 数字 + 关键词 / 纯数字 4–8 位)
-16. 特殊 App 解析(微信 / QQ / Telegram 优化 + 重要消息关键词标记)
-17. 构造 BarkMessage 并推送
-
-验证码开启自动复制后会被复制到剪贴板;推送级别在重要消息上自动提升到 `timeSensitive` 以点亮 iOS 焦点通知。
-
----
-
-## 八、使用建议
-
-- **只想收验证码**:进入「过滤」页,开启「验证码自动提取」和「广告过滤」;再到「应用」页切到白名单模式,只勾选短信类 App。
-- **想同步聊天**:保持黑名单模式(默认),在「过滤」页开启「微信 / QQ / Telegram 优化」。
-- **通知没推过来**:先看「日志」页,每条通知(无论转发、过滤还是失败)都会记录原因。失败会自动加入 pending 队列,由 WorkManager 每 15 分钟重发。
-- **想让通知带图标**:见下方「应用图标」一节。
-- **电话通知不工作**:MIUI 不向第三方监听器分发系统电话通知,GotMsg 通过轮询 `getCallState()` 绕过此限制。需授予「电话」权限。
-- **断网收不到通知**:开启「设置 -> 短信兜底」并填好 iPhone 号码、授予短信权限。断网时验证码和来电走短信(消耗套餐额度,5 分钟限 1 条)。
-- **想全平台通知**:可同时启用多个通道(每个通道的多个条目独立勾选),所有启用的会同时收到。
-- **推送报 connection closed**:通常不是被墙,而是手机上的代理 / VPN 客户端干扰 Bark 服务器连接;先关代理或换自建 Bark 验证。
-
----
-
-## 九、应用图标
-
-Bark 和 ntfy 的通知 `icon` 字段需要公网可访问的图片 URL。GotMsg 支持把已安装 App 的图标批量导出,方便上传到你自己的图床。
-
-规则:转发时 `icon = 图标 URL 前缀 + 安卓包名 + .png`。在「设置 -> 应用图标」里:
-
-1. 填写图标 URL 前缀,例如 `https://你的图床域名/icons/`。
-2. 选择一个目录,点「导出图标」,把该目录下所有 App 的图标以 `包名.png` 形式导出。
-3. 把导出的图片上传到你的图床对应目录。
-
-留空前缀则不显示图标。
-
----
-
-## 十、构建与体积
-
-Release 构建开启 **R8 + 资源压缩**,universal APK 约 5 MB;同时输出 ABI splits,每个架构单独的 APK 体积更小。
-
-构建:
-```bash
-export JAVA_HOME="D:/Dev/JDK-17" ANDROID_HOME="D:/Dev/Android/SDK"
-./gradlew assembleRelease
-# 产物:app/build/outputs/apk/release/app-universal-release.apk
-# app/build/outputs/apk/release/app-arm64-v8a-release.apk
-# app/build/outputs/apk/release/app-armeabi-v7a-release.apk
-# app/build/outputs/apk/release/app-x86-release.apk
-# app/build/outputs/apk/release/app-x86_64-release.apk
-```
-
-`release` 复用 `debug` 签名配置(`signingConfigs.getByName("debug")`),适合个人发布到 GitHub / Gitea Release;正式商店上架前需替换为独立的 release keystore。
-
----
-
-## 十一、界面截图
-
-| 首页 | 应用管理 | 过滤设置 |
-|---|---|---|
-|  |  |  |
-
-| 设置 | 转发日志 |
-|---|---|
-|  |  |
-
----
-
-## 十二、隐私与安全
-
-- GotMsg **不收集任何遥测**到第三方;本地仅记录最少必要的设备 ID / 密钥(用于回复中继鉴权,256 位随机,备份规则明确排除)。
-- 回复中继 `https://r.gotmsg.pp.ua` 只持久化**设备密钥 + 回复令牌的 SHA-256 哈希**,正文 24 小时后清除;回复链接放在 URL fragment 中,不会进入服务器访问日志。
-- 拿到回复链接的人可在 10 分钟有效期内提交一次回复,因此不要转发或公开该链接。
-- 无障碍 / Shizuku 兼容回复仅在收到有效的一次性回复事件时运行,严格校验目标包名;Shizuku 路径只点击经像素扫描确认的微信绿色发送按钮,避免误操作。
-
----
-
-## License
-
-本项目仅供个人使用。自 v1.10.2 起闭源。
-
-All Rights Reserved. 保留所有权利。
+- 最新安装包:[Releases](../../releases)
+- Android 最低版本:Android 14 / API 34
+- 自 v1.10.2 起项目闭源,公开仓库保留用户文档、截图和 Release 安装包。
+- 本项目仅供个人使用,**All Rights Reserved / 保留所有权利**。
diff --git a/docs/A2iReply-shortcut.md b/docs/A2iReply-shortcut.md
index 4b99801..b5be4ea 100644
--- a/docs/A2iReply-shortcut.md
+++ b/docs/A2iReply-shortcut.md
@@ -1,7 +1,7 @@
# A2iReply 快捷指令迁移说明
-v1.11.0 已移除旧的 iOS 快捷指令和 ntfy `_reply` topic 方案。请删除原有的 `A2iReply` 快捷指令;GotMsg 不再订阅或使用 `_reply` topic。
+GotMsg v1.11.0 已移除旧的 iOS 快捷指令和 ntfy `_reply` topic 方案。请删除原有的 `A2iReply` 快捷指令;GotMsg 不再订阅或使用 `_reply` topic。
-新版本会在可回复的 ntfy 通知中直接附加一次性网页链接。iPhone 和 Android 都可点开网页输入回复,不需要额外配置。
+新版本把一次性回复地址设置为 Bark / ntfy 通知的点击地址或“回复”动作,不会在通知正文中重复显示。iPhone 和 Android 都可直接打开网页输入回复,无需另外安装快捷指令或修改现有 ntfy topic。
-完整说明见 [notification-reply.md](notification-reply.md)。
+完整的安装要求、Shizuku / 无障碍配置、PIN 自动解锁和故障排查见 [通知远程回复](notification-reply.md)。
diff --git a/docs/notification-reply.md b/docs/notification-reply.md
index 705bfd1..7de8c1e 100644
--- a/docs/notification-reply.md
+++ b/docs/notification-reply.md
@@ -1,43 +1,94 @@
# 通知远程回复
-GotMsg v1.11.0 起支持从 iPhone 或另一台 Android 设备打开 Bark / ntfy 通知里的回复链接。回复会回到运行 GotMsg 的原 Android 手机。v1.12.0 起,除了原生通知快捷回复,还可选择使用无障碍兼容回复处理微信、QQ 等没有提供系统回复动作的聊天通知。
+GotMsg 可以从 Bark / ntfy 通知打开一次性回复网页,把回复送回运行 GotMsg 的原 Android 手机。系统会优先使用通知自带的 Android `RemoteInput`;QQ 等应用可使用无障碍兼容回复,微信使用 Shizuku 回复。
+
+> 远程回复不是模拟登录,也不会接管微信或 QQ 账号。能否成功取决于原通知是否仍然存在、原手机是否在线,以及目标应用当前界面是否可识别。
+
+## 开始前准备
+
+1. 在原 Android 手机上安装 GotMsg,并授权“通知使用权”。
+2. 至少启用一个 Bark 或 ntfy 转发配置;邮件和短信通道不提供回复入口。
+3. 关闭针对 GotMsg 的省电限制,允许后台运行和自启动。
+4. 根据要回复的应用完成下面的额外配置:
+ - 通知本身带快捷回复:无需额外配置。
+ - QQ、支付宝、淘宝、钉钉:打开 GotMsg“设置 → 通知回复 → 无障碍兼容回复”,并在系统无障碍设置中启用“GotMsg 兼容回复”。
+ - 微信:安装并启动 [Shizuku](https://shizuku.rikka.app/download/),授权 GotMsg。微信实际回复走 Shizuku,不依赖系统无障碍服务。
## 使用方法
-1. 在原 Android 手机的 GotMsg 中启用至少一个 Bark 或 ntfy 配置。
-2. 保持 GotMsg 的通知读取权限,并让原手机联网。
-3. 如需回复没有系统快捷回复入口的微信、QQ 等通知,在 GotMsg「设置 -> 通知回复」中开启「无障碍兼容回复」,再到系统无障碍设置中开启「GotMsg 兼容回复」。
-4. 每条 Bark / ntfy 转发通知都会带回复入口。Bark 接收端直接点通知即可打开回复页,通知正文也会附带回复链接;普通消息不会再跳微信/QQ等原 App。ntfy 接收端可点通知、通知动作或正文中的回复链接;如果 iOS 点通知本体只进入 ntfy App,请点消息正文里的回复链接。
-5. 网页提交后,原 Android 手机先尝试原通知的 `RemoteInput`;没有该动作时才使用已启用的无障碍兼容回复。GotMsg 的「日志」页会记录结果。
+1. 原手机收到通知后,GotMsg 将它转发到 Bark / ntfy。
+2. 在接收手机上点击 Bark 通知,或点击 ntfy 通知及其“回复”动作。
+3. 网页会显示应用名、通知标题和正文;输入内容并提交。
+4. 原手机拉取任务并执行回复,网页等待最终结果;GotMsg“日志”页也会记录结果。
-接收端无需安装 iOS 快捷指令,也无需创建或订阅 `_reply` topic。现有 ntfy server、topic 和 token 配置不需要改动。
+回复入口只作为通知的点击地址或动作地址,不会在通知正文中重复显示。接收端不需要 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。图案、字母密码和生物识别不属于该功能支持范围。
+
+## 生效条件与限制
-- 原生模式要求原 App 在该条通知上提供允许自由文本的 Android `RemoteInput` 动作,可以在后台完成。
-- 无障碍兼容模式会使用通知的会话入口打开原 App,只对白名单中的微信、QQ、支付宝、淘宝、钉钉生效。页面必须是聊天页,并存在可识别的输入框和明确的「发送」按钮。
-- 无障碍兼容模式要求原手机已解锁;执行时会亮屏、切换到对应 App。输入框已有草稿时会停止,不会覆盖草稿。
-- 付款、订单、验证码、营销和系统通知通常没有聊天输入框,即使带回复链接也不能发送回复。
-- 原通知不能被划掉或被新通知替换;进程未重启时 GotMsg 会短暂缓存通知入口,降低通知更新导致的失败概率。
- 回复链接从通知转发起 10 分钟内有效,并且只能成功提交一次。
+- 原通知不能被划掉或被新通知替换;进程未重启时 GotMsg 会短暂缓存通知入口,降低通知更新导致的失败概率。
- 原 Android 手机必须联网,GotMsg 进程和通知监听服务需要正常工作。
-- 某些 App 或定制系统不会向无障碍服务暴露聊天控件;这种情况下网页会显示具体失败原因。
-
-## 安全说明
-
-- 每条通知使用独立的 256 位随机回复令牌。令牌放在 URL fragment 中,不会随首次页面请求进入服务器访问日志。
-- GotMsg 安装时生成独立设备 ID 和密钥;原手机与中继 API 之间的注册、拉取和确认请求均需设备鉴权。
-- 中继只持久化设备密钥和回复令牌的 SHA-256 哈希。提交后的回复正文会在中继中短暂保存,处理完成后最多保留 24 小时用于状态查询和故障排查。
-- 拿到有效回复链接的人可在有效期内提交一次回复,因此不要转发或公开该链接。
-- 无障碍兼容回复仅在收到有效的一次性回复事件时运行,严格校验目标包名,并且只点击文字明确匹配「发送」的控件。该权限能够读取当前窗口内容,只应在你信任的原 Android 手机上启用。
-- 回复服务使用 `https://r.gotmsg.pp.ua`,不可在 App 设置中修改。部署或域名变更时需同步修改 `ReplyFeature.RELAY_BASE_URL` 并重新发布 APK。
+- 付款、订单、验证码、营销和系统通知通常没有聊天输入框,即使生成回复入口也可能不支持回复。
+- 兼容回复要求通知点击后真正进入对应聊天页;联系人页、登录页、广告页等不会被当作聊天页。
+- 某些 App 或定制系统不会向无障碍服务暴露聊天控件;界面更新后也可能需要重新适配。
## 常见失败
-- `回复链接已过期`:通知转发已超过 10 分钟。
-- `原通知已消失`:原 Android 手机上的通知已被清除或替换。
-- `请在 GotMsg 设置中开启无障碍兼容回复服务`:应用内开关已打开,但系统无障碍权限尚未开启。
-- `原手机需解锁后才能回复`:解锁原手机后,重新从一条新通知发起回复。
-- `未找到聊天输入框` / `未找到明确的发送按钮`:通知没有进入可回复聊天页,或原 App 当前版本的界面需要重新适配。
-- `聊天输入框已有未发送内容`:GotMsg 为避免覆盖原手机草稿而主动停止。
-- `原手机未确认回复`:中继未在超时时间内收到原手机处理结果,检查原手机网络、后台限制和 GotMsg 通知读取权限。
+| 提示 | 处理方法 |
+| --- | --- |
+| `回复链接已过期` | 链接有效期为 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。
diff --git a/screenshots/home-latest.png b/screenshots/home-latest.png
new file mode 100644
index 0000000000000000000000000000000000000000..460f34f46f770c90717ac24cdc553621e866ad98
GIT binary patch
literal 637191
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