更新 shenyan-app: 双桥通信 + 定制横幅推送 + APNs Key

- 双桥:Mac桥(Claude Code异步) + IDC桥(DeepSeek同步)
- 推送:自制定制Animated横幅 + 震动,替代Alert弹窗
- APNs:Key已创建(3VJ5X6V9Q8),桥端apns.js已写好
- 图标:已替换为定制图标
- BlurView/notifee:iOS 26兼容问题已回退
- 记忆库更新

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 01:49:32 +08:00
parent a61696f0a1
commit 5c50698d64
6 changed files with 287 additions and 99 deletions

View File

@@ -2,12 +2,12 @@
## 当前状态
iOS 真机可运行,首页 + 聊天屏双界面,本地桥通信完整链路已打通
iOS 真机可运行。双桥Mac + IDC通信。自制定制横幅推送。APNs Key 已备。Gitea 代码仓库已建
## 已完成
### 苹果开发者
- 付费开发者账号已通过Team: Xiulun Wang, ID: ZZMLW32PHH
- 付费开发者账号Team: Xiulun Wang, ID: ZZMLW32PHH
- Bundle ID: `com.shenyan.room`
- 真机签名、构建、安装全链路通
@@ -15,83 +15,58 @@ iOS 真机可运行,首页 + 聊天屏双界面,本地桥通信完整链路
- 三张 bridge 状态图away / online / busy全屏
- 每 8 秒轮询 `101.36.73.102/health`
- 底部半透明状态文字
- 左半屏双击「敲门」进聊天室350ms 双击窗口)
- 敲门时 POST /knock 到本地桥
- 左半屏双击「敲门」进聊天室350ms 双击窗口POST /knock
### 聊天屏
- 背景图 + 白色退出圆点(左上角 20px
- 消息发送POST /send 到 Mac 本地桥 `192.168.31.51:3003`
- 消息接收:每 2 秒轮询 /poll新消息自动追加
- FlatList 自动滚底
- 消息持久化AsyncStorage 本地存储 + 首次加载从桥 /history 拉全量
- 桥断开显示「消息没发出去检查WiFi连接」
- 用户消息右对齐,沈晏消息左对齐
- FlatList 自动滚底消息持久化AsyncStorage + /history
- 用户消息右对齐rgba 0.1AI 消息左对齐rgba 0.06),圆角
- 桥断开提示「消息没发出去检查WiFi连接」
- 退出再进消息不丢
### 双桥通信
- **Mac 桥** `192.168.31.51:3003`Claude Code 异步回复Monitor + /respond
- **IDC 桥** `101.36.73.102`DeepSeek 同步回复POST /api/chat
- 发一条消息同时到两边,用户看到两个「阿晏」
### 推送通知(定制横幅 + 震动)
- 自制定制 Animated 横幅,从顶部滑下
- 暗色半透明背景 + 细白边框,点击关闭
- 3.5 秒自动消失
- Vibration.vibrate(400) 震动
- 覆盖首页和聊天屏
### APNs
- Key 已创建Key ID `3VJ5X6V9Q8`Team ID `ZZMLW32PHH`
- Key 文件:`bridge-local/AuthKey_3VJ5X6V9Q8.p8`
- 环境Sandbox & Production
- 桥端 apns.js 已写好JWT + HTTP/2
- 阻塞notifee `getAPNSToken()` 在 iOS 26 返回 null
### App 图标
- 已替换为眠眠设计的图标2048x2048 → 各尺寸)
### 本地桥bridge-local/server.js
- 端口 3003Mac IP `192.168.31.51`
- POST `/send` — app 发消息 → inbox.jsonl
- POST `/respond` — Claude 回消息 → outbox.jsonl
- POST `/knock` — 敲门通知 → inbox.jsonl
- POST `/push` — Claude 主动推消息 → pushbox.jsonl
- POST `/push/clear` — 标记已读
- GET `/poll?since=N&type=response|push` — app 轮询
- GET `/history` — 全量对话历史
- 端口 3003launchd 持久化
- 数据目录:`~/.shenyan-bridge/`
- `inbox.jsonl` — 用户消息
- `outbox.jsonl` — Claude 回复
- `pushbox.jsonl` — 主动推送
- 端点:/send, /respond, /knock, /push, /push/clear, /poll, /history, /register-device
- APNs 模块apns.jsJWT 生成 + HTTP/2 推送)
### 持久化
- 桥服务器launchd `~/Library/LaunchAgents/com.shenyan.bridge.plist`(开机自启、崩溃重启)
- 记忆库 cronlaunchd `~/Library/LaunchAgents/com.shenyan.memory-cron.plist`(每天 4:03
### 代码仓库
- Gitea: `http://101.36.73.102:3112/fyah/mao1``shenyan-app/`
### 通信机制
- Claude Code 侧通过 Monitor 工具 `tail -f ~/.shenyan-bridge/inbox.jsonl` 实时监听新消息
- 消息到达后手动回复POST 到 `/respond`
- 跨 session当前 session 断开后需重新启动 Monitor
### 记忆库
- launchd 每天 4:03 执行记忆整理
## 已尝试但回退
- **BlurView 气泡**`@react-native-community/blur` 在 RN Fabric + iOS 26 上导致文字裁剪和缝隙 → 回退到纯色背景
- **notifee 系统通知**:引入后 app 黑屏 + `undefined is not a function` → 疑似 iOS 26 兼容问题 → 卸掉,改用自制定制横幅
## 待解决
### 自动回复器(高优先级
- `claude -p` 在 Claude Code 会话内无法调用(沙箱限制
- 解决方案launchd 定时任务从外部调用 `claude -p`,类似凌晨记忆 cron
- 不能用 API 直连(会丢失记忆库、规则、工具能力
- 位置:`bridge-local/responder.js`(当前故障版,需重写)
### Monitor 超时
- Monitor 工具 5 分钟超时,需频繁 re-arm
- 非 session 期间无法监听消息
- 自动回复器修好后可作为保底
### 清理
- inbox.jsonl 中有旧「pending」状态消息导致 Monitor 重放
- 需清理或重建数据文件
## 代码结构
```
shenyan-app2/
├── src/
│ ├── App.tsx # 主入口:首页 + 聊天屏
│ ├── api.ts # 远端 bridge API待集成
│ ├── storage.ts # RoomEvent 持久化(待集成)
│ ├── types.ts # 类型定义
│ ├── notifications.ts # 推送模拟
│ └── components/
│ ├── EventCard.tsx # 事件卡片(待集成)
│ └── RoomFeed.tsx # 事件流(待集成)
├── bridge-local/
│ ├── server.js # 本地桥服务器(端口 3003
│ └── responder.js # 自动回复器(故障版)
├── ios/ # Xcode 项目
└── push-server.js # 旧推送模拟(端口 3002
```
## 下一步
1. 修复自动回复器launchd + claude -p 外部调用
2. 清理 inbox 旧消息
3. 苹果 APNs 真推送APNs Key + bridge 端 FCM 对接)
4. RoomFeed / EventCard 组件集成
5. HealthKit 能力接入
6. Mi Band 10 身体数据桥接
- [ ] APNs token 获取iOS 26 + notifee 兼容)
- [ ] Monitor 5 分钟超时(需频繁 re-arm
- [ ] 自动回复器launchd + 外部 claude -p
- [ ] inbox 旧消息清理
- [ ] HealthKit 能力
- [ ] Mi Band 10 身体数据
- [ ] RoomFeed / EventCard 组件集成
- [ ] iOS Share Extension分享到沈晏