1d65d4ffc7
Auto-check GitHub Releases latest on launch (24h throttle), show an update banner on the home screen, download the APK in-app with progress, and trigger the system installer via FileProvider + REQUEST_INSTALL_PACKAGES. - core/UpdateChecker: fetch releases/latest, semver compare, stream APK to externalFilesDir, install via FileProvider (handles MIUI unknown-sources). - SettingsStore: updateCheckEnabled / lastUpdateCheckTime / ignoredVersion. - HomeScreen: update banner + UpdateDialog. - SettingsScreen: "关于与更新" card with auto-check toggle and manual check. - manifest: REQUEST_INSTALL_PACKAGES + FileProvider; new res/xml/file_paths.xml. - version 1.4.2 -> 1.5.0 (versionCode 7 -> 8). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
172 lines
8.0 KiB
Markdown
172 lines
8.0 KiB
Markdown
# A2i ·安到果(按倒过[呲牙])
|
||
|
||
把安卓手机上的通知(短信、验证码、电话“有电话进来这个通知,不是电话呼叫转移”、微信、QQ、Telegram 等)实时转发到 iOS,通过 [Bark](https://github.com/Finb/Bark) 推送到 iPhone / iPad。在 iOS 上点击通知,还能一键跳转到对应的 App。
|
||
|
||
适用于把安卓备机的消息同步到 iOS 设备,不漏验证码、不漏重要聊天。
|
||
|
||
## 主要功能
|
||
|
||
- **系统级通知监听**:接入 Android 通知监听服务,覆盖所有发出通知的 App。
|
||
- **Bark 推送**:支持官方 Bark 服务和自建 Bark Server,可保存多个服务器并随时切换。
|
||
- **验证码自动提取**:自动识别通知中的验证码,收到即复制,也可点击复制。
|
||
- **通知优化**:
|
||
- 广告关键词过滤(内置 + 自定义)
|
||
- 持续性通知过滤(音乐、下载、通话等 ongoing)
|
||
- 内容脱敏与去重
|
||
- 微信 / QQ / Telegram 专项优化(发送者作标题、按会话分组、重要消息提级、跳转 iOS 对应 App)
|
||
- **应用级规则**:黑名单 / 白名单两种模式,可按 App 单独控制是否转发。
|
||
- **失败自动重试**:发送失败的通知进入待重发队列,由 WorkManager 定期重试,也可手动触发。
|
||
- **本地日志**:保留最近 300 条处理记录,方便排查为什么某条通知被过滤或发送失败。
|
||
- **电话来电通知**:通过轮询 `getCallState()` 实时感知来电和未接来电(绕过 MIUI 对系统电话通知的限制,需授予"电话"权限)。
|
||
- **断网短信兜底**:无网络时自动把验证码、来电用短信发到 iPhone。
|
||
- 自动识别运营商(移动/联通/电信/广电),发免费查询短信拿套餐内短信余量
|
||
- 余额 ≤5 条自动停用,下次打开 App 提醒
|
||
- 每 5 分钟最多发 1 条,避免刷屏
|
||
- 自动解析失败时回退手动额度计数
|
||
- **应用内更新**:每天自动检查 GitHub 新版本,发现新版后一键下载并通过系统安装器升级,无需手动去网页下载。
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装
|
||
|
||
从 [Releases](../../releases) 下载最新 APK,安装到安卓手机(需 Android 14 / API 34 及以上)。
|
||
|
||
### 2. 配置 Bark
|
||
|
||
1. 在 iOS 上安装 [Bark](https://apps.apple.com/us/app/bark-customed-push/id1613210986)。
|
||
2. 打开 Bark,复制你的专属推送地址,形如 `https://api.day.app/你的Key`。
|
||
3. 在 a2i 的「设置」中添加服务器:
|
||
- 名称:随意,例如「我的 iPhone」
|
||
- 服务器地址:`https://api.day.app`(自建则填自建地址)
|
||
- Device Key:Bark 地址中的那段 Key
|
||
|
||
### 3. 授权通知监听
|
||
|
||
打开 a2i,首页会提示「需要授权通知监听」。点击「前往系统授权」,在系统的通知访问设置中开启 a2i。
|
||
|
||
> 授权是一次性的,卸载后重新安装需要再次授权。
|
||
|
||
### 4. 开启转发
|
||
|
||
回到首页,打开「通知转发」开关。此时安卓收到的通知就会按规则推送到 iOS。
|
||
|
||
## 使用建议
|
||
|
||
- **只想收验证码**:进入「过滤」页,开启「验证码自动提取」,把「广告过滤」等按需开启;再到「应用」页切到白名单模式,只勾选短信类 App。
|
||
- **想同步聊天**:保持黑名单模式(默认),在「过滤」页开启「微信 / QQ / Telegram 优化」。
|
||
- **通知没推过来**:先看「日志」页,每条通知(无论转发、过滤还是失败)都会记录原因。
|
||
- **想让通知带图标**:参考下方「应用图标」一节。
|
||
- **电话通知不工作**:MIUI 会把系统电话通知限制为不向第三方通知监听器分发,本 App 通过轮询 `getCallonyState()` 绕过此限制。需要授予「电话」权限(设置 → 应用 → a2i → 权限 → 电话)。
|
||
- **断网收不到通知**:开启「设置 → 断网短信兜底」,填好 iPhone 号码、授予短信权限、设好手动额度。断网时验证码和来电会走短信(消耗套餐额度,5 分钟限 1 条)。
|
||
|
||
## 应用图标
|
||
|
||
Bark 的 `icon` 字段需要一个公网可访问的图片 URL。a2i 支持把已安装 App 的图标批量导出到你选择的目录,方便上传到你自己的图床。
|
||
|
||
规则:转发时 `icon = 图标 URL 前缀 + 安卓包名 + .png`。在「设置 → 应用图标」里:
|
||
|
||
1. 填写图标 URL 前缀,例如 `https://你的图床域名/icons/`。
|
||
2. 选择一个目录,点「导出图标」,会把所有 App 图标以 `包名.png` 的形式导出。
|
||
3. 把导出的图片上传到你的图床对应目录。
|
||
|
||
留空前缀则不显示图标。
|
||
|
||
## 自建 Bark 服务(可选)
|
||
|
||
a2i 默认用 Bark 官方服务器(`https://api.day.app`),免费够用。如果想完全自控、不限速、不依赖第三方,可以自建 Bark Server。下面是三种零成本方案:
|
||
|
||
### 方案 1:Vercel 云托管(最适合新手)
|
||
|
||
把 Bark 后端跑在 Vercel 的 Serverless 上,每次推送触发一个云函数,不挂进程、完全免费。
|
||
|
||
- 平台:[Vercel](https://vercel.com) · 代码:[GitHub](https://github.com)
|
||
- 在 GitHub 搜索 `bark-server-vercel`,项目 README 里通常有 **Deploy with Vercel** 按钮,一键克隆部署
|
||
|
||
### 方案 2:Cloudflare Workers(最稳定)
|
||
|
||
把轻量 JS 转发代码部署到 Cloudflare 全球边缘节点,免费额度每天 10 万次请求,个人用属于「溢出」状态。
|
||
|
||
- 平台:[Cloudflare](https://www.cloudflare.com)
|
||
- 在 GitHub 搜索 `bark-server-cloudflare` 或 `bark cloudflare worker`,在 Cloudflare 后台新建 Worker 粘贴脚本保存即可
|
||
|
||
### 方案 3:免费 VPS + Docker(最高自主权)
|
||
|
||
在永久免费的 Linux 虚拟机上用 Docker 跑官方 bark-server。
|
||
|
||
- 官方服务端:[finab/bark-server](https://github.com/finab/bark-server)
|
||
- 反向代理 + 免费 HTTPS 证书:[Nginx Proxy Manager](https://nginxproxymanager.com)
|
||
- 免费 VPS:[Oracle Cloud 永久免费层](https://www.oracle.com/cloud/free/)、[AWS 一年免费套餐](https://aws.amazon.com/free/)
|
||
|
||
### ⚠️ 防坑提示
|
||
|
||
国内网络下,Vercel 的 `*.vercel.app` 和 Cloudflare 的 `*.workers.dev` 二级域名可能间歇性无法访问。**终极方案**:注册一个便宜的个人域名(或找免费域名),解析托管到 Cloudflare,然后把 Vercel / Worker 绑到**自定义域名**上——既稳定又秒达。
|
||
|
||
自建完成后,在「设置 → Bark 服务器」里填自建地址即可。
|
||
|
||
## 技术栈
|
||
|
||
- Kotlin + Jetpack Compose(Material 3)
|
||
- AndroidX DataStore(持久化设置与日志)
|
||
- OkHttp(Bark 推送)
|
||
- WorkManager(失败重试)
|
||
- Navigation Compose(单 Activity 多页面)
|
||
- 最低 Android 14(API 34),目标 Android 16(API 36)
|
||
|
||
## 本地构建
|
||
|
||
需要 JDK 17 和 Android SDK。
|
||
|
||
```bash
|
||
# 设置环境变量(按你的安装路径)
|
||
export JAVA_HOME=/path/to/jdk-17
|
||
export ANDROID_HOME=/path/to/android-sdk
|
||
|
||
# 构建 debug APK
|
||
./gradlew assembleDebug
|
||
|
||
# 构建可分发的 release APK
|
||
./gradlew assembleRelease
|
||
```
|
||
|
||
产物位置:
|
||
|
||
- debug:`app/build/outputs/apk/debug/app-debug.apk`
|
||
- release:`app/build/outputs/apk/release/app-release.apk`
|
||
|
||
安装到已连接的设备:
|
||
|
||
```bash
|
||
adb install -r app/build/outputs/apk/release/app-release.apk
|
||
```
|
||
|
||
## 界面截图
|
||
|
||
| 首页 | 应用管理 | 过滤设置 |
|
||
|---|---|---|
|
||
|  |  |  |
|
||
|
||
| 设置 | 转发日志 |
|
||
|---|---|
|
||
|  |  |
|
||
|
||
## 工作原理
|
||
|
||
```
|
||
Android 系统通知
|
||
└─ NotifyListenerService 接收
|
||
└─ NotificationProcessor 处理流水线
|
||
├─ 全局开关 / ongoing 过滤 / 黑白名单
|
||
├─ 空内容、脱敏、噪音、系统状态过滤
|
||
├─ 广告关键词过滤
|
||
├─ 去重(5 秒窗口)
|
||
├─ 验证码提取
|
||
└─ 微信 / QQ / Telegram 专项解析
|
||
└─ BarkClient 推送到 Bark Server
|
||
└─ 失败 → 待重发队列 → RetryWorker 定期重试
|
||
└─ 写入本地日志(最近 300 条)
|
||
```
|
||
|
||
## License
|
||
|
||
本项目仅供个人使用。
|