视觉按最新原型,业务按已确认PRD。现有代码为满足设计而改造。执行见按设计实施与任务卡;当前代码与验证范围见消费者功能页。
原生缓存完成后的转发清理
2026-10-04。已修改现有 Go 和 RN 项目。runtime11 已在本地构建;业务服务、安装包和 OTA 未发布。
下载完成、失败或删除时,原生下载器通知服务器关闭该任务的 RAM 转发。无需等待 App 回到前台。普通直连下载不会发送此通知;等待 Wi-Fi 和用户暂停仍保留可恢复任务。
接线
| 位置 | 实现 |
|---|---|
Go consumer_offline_relay.go |
POST /api/consumer/offline/media/<capability>/release,空请求体、204响应;仅删除这个内存能力及其媒体上下文 |
Android JukuOfflineStore |
复用 Media3 完成、失败、移除和原生索引恢复回调;JukuOfflineRelayCleanup 发送短请求 |
Apple DramivioOfflineEngine |
复用系统下载的终态、删除和恢复记录;DramivioOfflineRelayCleanup 使用独立无缓存 URLSession |
Expo plugins/withOfflineBackground.js |
通过官方 withAppDelegate 生成 iOS 后台事件转接;其他系统会话交给 Expo 原处理 |
| 原 JS 队列 | 保留已认证的 release(orderId,assetId),作为前台恢复时的补充 |
完成通知从原生已验证的转发地址派生,限定同一 API、同一能力目录。它不携带网站 Cookie、登录凭据、来源头或视频,且不跟随重定向。不能凭订单编号关闭其他任务,也不能签发许可、取消订单或修改缓存文件。旧任务迟到的通知只关闭旧能力,新线路使用的新能力继续有效。
短请求超时3秒,失败最多执行两次原生自动重试。重复通知、已过期能力和服务器重启后的旧能力均返回204。恢复时已有终态索引/记录可再次通知;没有增加业务表、登录系统或另一套视频队列。
测试
| 范围 | 结果与覆盖 |
|---|---|
| RN App | 历史终态阶段359/359;当前全量371/371,类型检查通过;新增 Expo 生成、重复生成和保留其他回调检查 |
| Android Media3 | 40/40;实际下载索引与文件缓存,终态通知、移除、失败、重启、Wi-Fi等待;真实本地HTTP空POST、去重及302不跟随 |
| Apple SDK | 193/193;实际 Foundation/AVFoundation 文件与策略;新增 URLSession 通知、无凭据、去重与503重试夹具 |
| Go race | 本轮离线相关12项通过,2个需要外部联合夹具的入口跳过;这些入口不计通过 |
| 公开 API 联调 | 实际 Go、Better Auth 邮箱登录与隔离 RAM PostgreSQL;直连准备、同许可转发、无凭据释放、重复/迟到通知、新线路Range播放与数据库状态检查通过 |
| 保存的播放器补丁 | 在原版 react-native-video 6.19.2 上干净应用;23个源码文件与实际编译源码一致,无构建文件混入 |
| 构建 | 当前 Go、runtime11 Android ARM64测试APK、iOS Hermes导出和iOS原生项目生成通过 |
实际联调最终:转发会话0、视频RAM0、转换任务0;同一集扣次1,资产仍为ready,原许可及到期时间不变。邮箱、安装批准和视频使用明确测试夹具;没有联系真实来源或发送邮件。此前 runtime8 三集加密缓存的模拟器验收保留为历史证据,本轮 runtime11 APK 已完成 Android36 首次注册设备和 CENC 三集播放验收;转发终态释放结果沿用此页明确的隔离联调记录。
尚需完成
剩余尚未进入原生下载器的选集仍由前台 JS 调度。系统强退、进程被杀或断网时,无法保证通知立即送达;服务器已有最多30分钟的能力期限和上下文关闭作为最终回收。完整 iOS 构建、AppDelegate 与系统后台唤醒的真机验收仍待完成。通知的 Apple URLSession 测试使用协议夹具,不能替代 iOS 后台执行验收。
本轮由主 Agent 复核,没有新增独立子 Agent 结论。复核覆盖了旧通知与新线路隔离、重复通知、原生终态回调、Expo生成的宿主转接,以及切换账号时尚未入队的HLS准备会话清理。
复用依据:Android Media3 下载、Expo 配置插件。