# 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
```

## 界面截图

| 首页 | 应用管理 | 过滤设置 |
|---|---|---|
| ![首页](screenshots/home.png) | ![应用管理](screenshots/apps.png) | ![过滤设置](screenshots/filter.png) |

| 设置 | 转发日志 |
|---|---|
| ![设置](screenshots/settings.png) | ![转发日志](screenshots/log.png) |

## 工作原理

```
Android 系统通知
  └─ NotifyListenerService 接收
       └─ NotificationProcessor 处理流水线
            ├─ 全局开关 / ongoing 过滤 / 黑白名单
            ├─ 空内容、脱敏、噪音、系统状态过滤
            ├─ 广告关键词过滤
            ├─ 去重（5 秒窗口）
            ├─ 验证码提取
            └─ 微信 / QQ / Telegram 专项解析
       └─ BarkClient 推送到 Bark Server
            └─ 失败 → 待重发队列 → RetryWorker 定期重试
       └─ 写入本地日志（最近 300 条）
```

## License

本项目仅供个人使用。
