Rodger-Wang
|
18a7160183
|
清理:QQ 音乐整体下线(插件、Dart 服务、灵犀 AI 里的 QQ 音乐工具、iOS 回跳)
用户决定整个删掉(2026-09-24)。
- 删 local_plugins/qq_music 整个插件(含 QPlayAutoSDK 与 Android aidl aar,约 3.5MB);
pubspec、android settings.gradle、根 build.gradle 与 app build.gradle 里的 flatDir 引用同步去掉
- Dart:QqMusicService(qq_music.dart)删除;翻译页 suspend/restoreOtherServices 里暂停/恢复 QQ 音乐的分支去掉;
main.dart 的 deepvoice://qqmusic 深链接分支与 SplashController.handleQQMusicLogin 去掉
- iOS Runner:AppDelegate 里把 eaimar:// 转给 "qq_music" 通道的那段去掉(该通道名本来就和插件
实际注册的 com.yunqiinnovation.qq_music 对不上,回跳一直是空转);LSApplicationQueriesSchemes 去掉 qqmusic
- 灵犀/移动精灵 AI(原生):
- chat_api 两端删 QQMusicSystemFunctionHandler(9 个 qqmusic_* 工具);MCPClient 的 "QQ"/未指定/AUTO
一律走网易/系统音乐工具
- agent_service 两端删 qqmusic_searchandplay_songs 的播放处理、Android 的 QQMusicSingleton 初始化与
autopause/resume 的 QQ 分支;Package.swift / build.gradle 的 qq_music 依赖去掉
- 行为变化:Dart 从未传 musicServiceType,Android 原本就不注册音乐工具、QQ 分支走不到,无变化;
iOS 原本「装了 QQ 音乐就给 AI 用 QQ 工具」,现在一律用网易/系统音乐工具
保留:MusicManager(翻译时暂停其它 App 的音乐,走 music_service,与 QQ 无关);
eaimar:// URL scheme 注册(App 级深链接入口,只去掉转发给 QQ 的那步)。
验证:dart analyze 无 error、无 unused_import;flutter test 221 全过;flutter build ios --no-codesign 通过。
Android 编译同第 4 批,受本机缺 Rosetta 影响未验证。
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 362a3ac70aac2d79d0483076997949c8b2dac2a9)
|
2 weeks ago |
Rodger-Wang
|
4753d37c69
|
版本更新判定改口径:按平台分版本、最低版本留空=线上版本、渠道未上架不推、地址回退链
判定仍全在服务端算好下发,客户端只拿结论。规则:
1. Android / iOS 各一套版本号:app_release 加 ios_version / ios_min_version
(启动 ALTER ... ADD COLUMN IF NOT EXISTS 幂等),原 version/min_version 只管
Android,平台由渠道号推导(只有 GlobalApple=101 是 iOS)。iOS 没填时**不回退
Android 的**——回退等于又回到共用一个版本号:Android 先发 1.0.3 而 iOS 商店还是
1.0.2 时,iOS 用户会被指向一个商店里没有的版本。
2. 最低支持版本留空 = 线上版本:勾上强更不填最低版本,就是「所有低版本都强更」;
填了则只强更低于它的,介于两者之间的仍是推荐。后台校验相应改成「至少填一个
平台的线上版本」。
3. 渠道行状态不是「已上架」(审核中/已下架)时不推送推荐更新——商店里还是旧包。
强更不受此限,它的地址会由回退链换成官方包。
4. 下载地址回退链:Android 渠道 = 本渠道(须已上架)→ 官方渠道(100) → 默认下载
地址;iOS / Google 只认本渠道,没有就空——那两处如今放的是 apk 直链。
5. 算不出任何地址时两种更新都不提示,强更也不例外:一个点了没反应又关不掉的
弹窗等于把用户锁死。
客户端三处配套:推荐更新的「稍后提醒」记住版本号,同一版本 24 小时内冷启动不再弹
(强更与手动检查不受影响);设置页手动检查绕过 10 分钟缓存;Android 上服务端地址
打不开时回退网页下载页(iOS 不兜底,那页给的是 apk)。
另修后台上传安装包报「必须先选择应用」:X-App-Id 头来自登录态的 currentAppId,
只有绑定了应用的运营/代理账号才有;超管在页面顶部选的应用只是个 app_name 字符串,
从不进请求头。现在 uploadFile 把它放进请求体,服务端没有 X-App-Id 时按 name /
app_name 反查注册表补作用域。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
3 weeks ago |
Rodger-Wang
|
6a64c3d008
|
把两处网络请求移出启动与设备页的关键路径
会议模板不再挡启动与登录
_performParallelTasks 名字叫并行、实际完全串行(网络检查 → 版本检查 →
token 校验,后者内部又是 getLoginToken → getAppConfig → _initMeetingTemplate),
冷启动要串等 5 次网络往返,而 _initializeApp 要等这一整串跑完才允许导航。
其中 ②③ 之间的串行是刻意的(强更弹窗必须先出、把 splash 卡住,见 CLAUDE.md),
不能改回并行;但 _initMeetingTemplate 排在最后、**启动时没有任何地方要用它**
——模板只落 sqlite,由会议模板页 getMeetingTemplateList 消费。改成 unawaited,
模板照常拉取更新,启动不再等它。
登录流程里同一句挡在 Get.offAllNamed(Routes.home) 前面,一并改。
设备页先渲染再补登记
loadDevices 里 `await BesDeviceAuth.verifyConnected()` 串在 getdevices
前面,首次进入白名单没命中时会真的去打 user_binddevice(带 10s 超时),
整个页面干等两次网络往返——就是「点设备页半天没响应」。
- isLoading 改成只在本地无数据时才遮罩:onInit 里 _refreshFromUser() 本来
就已经拿本地列表渲染过一次了,再盖一层纯属让用户对着转圈等。
- verifyConnected 挪到列表渲染之后、改成后台跑。它登记成功时会直接把设备
塞进 User.instance.devices,回来 _refreshFromUser() 刷一次即可,
不必再拉一遍 getdevices。
⚠️ 代价:首次连接的新耳机会晚一两秒才出现在列表里(以前是干等到它出现才
显示整个页面)。这是「页面立刻可见」的必然结果。
⚠️ 两处的实际收益都要在 release 包上量,debug 的 JIT 会把差异淹掉。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
1 month ago |
Rodger-Wang
|
2d1ee0b783
|
apps/client 首次入库(Flutter 移动端)
从 /Users/yunyanzhineng/work/eaimar_client-main 搬入,未带原 .git,历史留在原仓库。
3215 个文件 / 约 118MB,其中约 40MB 是构建必需的预编译 SDK(azure_speech 的
MicrosoftCognitiveServicesSpeech.xcframework、device_jieli 的 JL_BLEKit 等)。
build/ (5.2G)、ios/Pods/ (311M)、android/.gradle/ (120M) 已由 .gitignore 挡掉。
本次入库的代码包含两项刚做完的改动:
1) 游客登录入口接上服务端开关。此前 _checkGuestLoginConfig() 恒定写死 true,
入口根本不读配置。现改为取服务端算好的结论,并把入口所在的 Builder 改成 Obx
——配置是异步拿到的,Builder 只渲染 onInit 时的初值 false,入口再也不会出现。
拿不到配置时按隐藏处理:默认显示会在送审期把不该露的入口露给审核员。
⚠️ 已发布的老客户端关不掉(写死 true),只对本版及以后生效。
2) iOS 上架合规修复:
- 移除 ATT/IDFA:删掉 Info.plist 的 NSUserTrackingUsageDescription、
SKAdNetworkItems、NSAdvertisingAttributionReportEndpoint,删掉 splash 里的
授权请求与 app_tracking_transparency 依赖。本 App 从不读取 IDFA,也没有任何
广告/归因 SDK,弹框纯粹劝退用户,还要在 App Store Connect 申报追踪数据类型。
- ios/Podfile 里那段 config.build_settings.delete('NSUserTrackingUsageDescription')
是无效代码(该 key 在 Info.plist 里,不是 build setting),换成注释说明。
- 通讯录符号(ITMS-90683 被拒原因)随之一并解决:permission_handler 走 SPM 后
按 Info.plist 有无对应 key 决定编不编,判定结果被 SwiftPM 按内容哈希缓存,
改完 plist 必须清 DerivedData 与 manifests 缓存才会重新求值。
另附 GOOGLE_PLAY_RELEASE_CHECKLIST.md:Google Play 上架阻塞项的实测梳理
(targetSdk 36 与 Billing 8 的 2026-08-31 期限、16KB 页对齐不合规的两个 .so、
支付回退逻辑的下架风险)。
⚠️ android/app/sign/ 下的 eaimar.keystore 与 Eaimar.properties(含明文签名密码)
随本次提交入库,与本仓库"私有仓库下接受真实凭据"的既有取舍一致。
仓库若要公开,这两个必须先摘出去。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
1 month ago |