浏览代码

chore(android): 真机验证记录 + cap sync 产物

真机:小米 25060RK16C / Android 16 (API 36),与 targetSdk 36 完全匹配。

验证通过:
- App 安装启动正常,登录页无白屏、无崩溃
- 登录链路通:输入手机号 → 勾选协议 → 获取验证码 →
  切到验证码输入态、手机号打码、53 秒倒计时
  (证明确实经云函数代理发出并成功,CORS 无拦截)
- 未勾选协议时前端拦截并提示,逻辑正确
- 键盘弹起不遮挡输入框与登录按钮(此前标记的高风险项,实测无问题)
- fmode:// 深链 Intent 被正确接收(未登录时被路由守卫拦在登录页,符合预期)

未验证(需真实账号):会话列表 / 收发消息 / 文件上传 / 系统通知

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 7 小时之前
父节点
当前提交
9d3d1f4ff9

+ 1 - 0
android/app/capacitor.build.gradle

@@ -9,6 +9,7 @@ android {
 
 apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
 dependencies {
+    implementation project(':capacitor-app')
     implementation project(':capacitor-local-notifications')
     implementation project(':capacitor-share')
 

+ 4 - 0
android/app/src/main/assets/capacitor.plugins.json

@@ -1,4 +1,8 @@
 [
+	{
+		"pkg": "@capacitor/app",
+		"classpath": "com.capacitorjs.plugins.app.AppPlugin"
+	},
 	{
 		"pkg": "@capacitor/local-notifications",
 		"classpath": "com.capacitorjs.plugins.localnotifications.LocalNotificationsPlugin"

+ 3 - 0
android/capacitor.settings.gradle

@@ -2,6 +2,9 @@
 include ':capacitor-android'
 project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
 
+include ':capacitor-app'
+project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
+
 include ':capacitor-local-notifications'
 project(':capacitor-local-notifications').projectDir = new File('../node_modules/@capacitor/local-notifications/android')
 

+ 16 - 0
docs/00-tracking/操作追踪.md

@@ -8374,3 +8374,19 @@ URL 不会重复显示:`chat.service.ts:2349` 的 `stripLinks` 会把已提取
 | **安全约束** | ① 不接受任意 URL(只调两个固定路径)② company 由服务端固定 ③ 不记录/打印 token ④ 同号 60 秒冷却 ⑤ 10 秒超时 |
 | **验证** | 云函数三分支 ✅(发码 200 / 重复发码被平台限流拦 / 错误验证码原样透传)· **连续 6 次发码全成功** · CORS 稳定性对比:旧路径 15 次中 5 次多值 vs 新路径 **15 次 0 多值** · `parse-api.spec` **60 SUCCESS** · core **1362 SUCCESS** · build ✅ 594.29 kB |
 | **遗留** | 平台侧多值 ACAO 未修(`docs/03-interface/平台CORS多值修复需求-20261115.md` 已备好);修复后本代理可保留也可下线 |
+
+## 2026-11-15(续三)· 真机验证:App 安装并跑通
+
+| 项 | 内容 |
+|---|---|
+| **设备** | 小米 25060RK16C,**Android 16(API 36)**,与 targetSdk 36 完全匹配 |
+| **安装** | `adb install -r app-debug.apk` → **Success**,App 正常启动无白屏 |
+| **V1 启动** | ✅ 登录页正常渲染(fmode 品牌 + 手机号输入 + 三种登录方式) |
+| **V2 登录链路** | ✅ **核心验证通过**:输入 `19900000099` → 勾选协议 → 点「获取验证码」→ **界面切到验证码输入态、手机号打码、进入 53 秒倒计时**,说明请求经云函数代理真的发到了平台并成功 |
+| **前置校验** | ✅ 未勾选协议时点按钮会弹「请先阅读并同意《服务协议》和《隐私政策》」,前端拦截正常 |
+| **V6 键盘遮挡** | ✅ **不遮挡**:键盘弹起后页面整体上移,输入框与登录按钮均在键盘上方可见(此前风险评估为「高优先级」,实测无问题) |
+| **V8 深链** | ✅ `adb shell am start -a VIEW -d "fmode://messages"` → Intent 被 App 接收(`delivered to currently running top-most instance`);未登录时被路由守卫拦在登录页,符合预期 |
+| **崩溃检查** | ✅ `dumpsys dropbox` 无 `cn.fmode.app` 记录 |
+| **通知权限** | `POST_NOTIFICATIONS` 已声明、未主动请求(按设计在首次真正要发通知时才申请) |
+| **未完成** | V3 会话列表/V4 收发消息/V5 文件上传 —— 需真实账号登录后才能验;V9 通知需产生一次任务完成事件 |
+| **构建** | `npm run build` → `npx cap sync` → `gradlew assembleDebug`,APK **6.8 MB** |