# 原生缓存队列

2026-10-04（UTC）。Android 与 iOS 已接入原生选集接力，App 通过同一个批量接口交接原订单。最多两集同时处理，排队不扣次，槽位空出后才准备下一集。视频继续由 Media3、URLSession 和 AVAssetDownloadURLSession 下载。

普通渠道按已确认范围播放：Web 每天10集、App每天50集，共享逐集记录；当天重播或换线路不重复扣次。设备实际直连失败后才转发。复制直链到外部播放器后的观看不属于本站次数控制。

## 接入方式

后台 `POST /api/consumer/offline/queue` 交接已有订单和原选集，复用 Better Auth、安装资格、渠道权限、下载策略和逐集账本。交接只读取元数据，不解析视频、不占视频槽、不预留或扣次。短期地址绑定原订单/设备/选集，邮箱 Cookie 和 Authorization 留在服务器 RAM。

交接期限取30分钟、官方会话期限和安装资格期限中的最早时间。后台批量入口 `createOfflineAPI(owner).queue(order)`，App入口 `createNativeOffline().enqueueQueue(lease, order, options)`；`supportsQueue()` 判断安装包能力。旧安装包保留原前台调度。

Android 将整个订单先保存到 Media3 索引，再启动两工人队列。iOS 将待办信息保存到已有原生清单，再由原生调度器读取进度和准备许可；实际媒体任务进入原来的四个系统下载会话。已暂停的系统任务也由两槽调度恢复，不能绕过并发上限。iOS 后台事件完成通知等待当前元数据请求、文件验证和必要的转发释放；系统视频任务登记后才交还回调。

## 重试与转发

先保存原许可、固定到期时间和进度版本，再触发视频下载。实际直连网络失败后才申请原资产转发；转发必须保持原订单、资产、许可、设备和到期时间。只删除本集未完成的数据。Wi-Fi等待、用户暂停和容量不足不触发转发。

正常终态等待准确的转发释放返回204，再让下一集使用槽位。结果不明的准备或转发请求暂停待办选集，用原订单恢复。重试不另建订单、不重复扣次、不延长媒体许可。交接失效不使已完成、仍有效的文件失效。

iOS取消已经发出的准备/转发POST后，保留最长20秒的结果回调；迟到的转发许可只用于释放其原RAM槽，不能重新开始视频。读请求可立即取消。重复交接保留用户暂停，只有明确重试才恢复。源地址、来源头和控制地址不进入JS订单持久化。

## 位置与账号

原生列表返回白名单资产许可与进度版本，App断网也能把后台完成的集数恢复到原订单。已有未补传位置不会被新读取的进度覆盖。原生冷启动锁定账号；任务清单不代表登录，确认本机身份后才能显式恢复。App本机允许保存离线视频，网站仍只使用RAM。

## 验证

| 检查 | 当前结果 | 范围 |
| --- | --- | --- |
| App全量与类型 | 371/371，类型通过 | 实际App模块、SDK/React及明确的HTTP/存储/原生适配器 |
| Apple源码与队列 | 227/227，其中34项新增队列检查 | macOS Foundation/AVFoundation、实际原生清单和调度器、真实URLSession回调；媒体任务为明确的系统入队适配器 |
| Android原生 | 54/54 | 前一阶段实际Media3、SQLite、DownloadHelper、缓存和两工人；本轮重新验证；Android源码未改 |
| 原生补丁 | 26个源码文件，干净应用通过 | 原版react-native-video 6.19.2；不包含构建产物 |
| Android产物 | runtime11，ARM64本地构建通过 | debug签名测试包；不能代替设备/后台验收 |
| 后台交接联合运行 | 沿用7组通过、一次扣次 | 此前公开Go/Better Auth/RAM PostgreSQL；OTP、安装资格和媒体为明确夹具 |
| 平台与Go | 沿用273/273、race16通过/2跳过 | 本轮没有后端代码变更 |

新增检查覆盖三集两槽接力、MP4/HLS原生入队、Wi-Fi策略、暂停、切号、迟到取消、容量拒绝、同许可转发、准确释放后接力、重复交接、冷启动身份锁、进度恢复、未知POST、跨来源控制地址、重定向及超大JSON拒绝。

[验证记录](dramivio-native-queue-validation.json)。本轮为主Agent源码复核与故障测试，没有新增独立子Agent复审。

## 验收范围

注册修复前的runtime11包已在Android36模拟器接实际Go API、Better Auth和隔离RAM PostgreSQL完成三集后台接力、断网冷启动、连续播放与联网位置补传。Wi-Fi等待0扣次，三集完成共3扣次；最终服务器视频RAM、任务和转发会话为0。测试媒体为6秒普通MP4，邮件发送和安装资格为明确夹具。当前HLS、系统强杀和实体设备仍待验收。[模拟器记录](dramivio-runtime11-validation.json)。iOS仍需完整Xcode/iPhoneOS SDK构建和真机后台验收，本机只有macOS SDK。本轮测试证明原生调度与元数据回调行为，不能证明iPhone系统何时允许后台执行。

系统强退、拒绝后台运行或交接到期不承诺无限续传；返回前台后按原订单恢复。真实来源/SMTP、安装资格、邀请观看证明、完整设计/剧库/生产负载与业务发布仍待完成。

本地测试包连接本机API/OTA，使用debug签名。CF本次只同步静态文档；正式App、API和OTA尚未发布。

本轮发现并修正本地构建入口读取`.env`中正式地址的问题。新包在prebuild和JS打包时明确注入本机API/OTA，并检查实际APK内容；旧runtime10产物撤出本机测试下载列表。

首次注册设备遗漏已修复：旧本机签名设备记录在发送官方邮箱OTP前，通过已有Go握手刷新；刷新失败不发OTP。新增3项回归、实际SDK/Go/Better Auth/RAM PostgreSQL联调及最新runtime11 APK的Android36首次注册均通过。原注册时间保持不变，设备记录一致，测试未产生邀请奖励或安装资格。此前三集播放运行中的设备为空观察保留为历史记录。[注册修复验证](dramivio-registration-viewer-validation.json)。

最新 runtime11 CENC 模拟器验收已通过：关闭模拟器无法报告有效 Wi‑Fi 时的 Wi‑Fi-only 开关后，3 集加密媒体全部缓存并由离线播放器打开；3 次扣次、7 次媒体请求，服务器转发会话、视频 RAM、解码任务均为0。恢复网络后3条位置均上传，`completed=false`，不会把离线播放当作邀请可信观看。完整真机、真实来源和生产媒体仍待验收。[CENC runtime11 验证](dramivio-cenc-runtime11-validation.json)。
