视频能播,代理抓包却绕过了媒体流:HarmonyOS 7 enableMediaNetworkProxy 接入与回归
视频能播,代理抓包却绕过了媒体流:HarmonyOS 7 enableMediaNetworkProxy 接入与回归
WebView 里的菜谱详情接口能被代理记录,视频也能正常播放,但媒体分片完全不在代理日志中。团队因此误判“所有请求都已纳入调试链路”,直到灰度环境才发现媒体域名使用了不同出口。
本文交付:一个 MediaProxyPolicy、媒体/普通请求对照测试、切换时序和回归表,帮助证明媒体流是否真正经过代理。。
两种行为不同的案例
案例一:开发环境抓包
仅在明确的调试构建和受控代理中开启媒体代理,记录分片 URL、状态码与播放结果。
案例二:企业网络出口
代理不可用时允许策略化回退,并向页面暴露“直连/代理/回退”状态,不能静默改变出口。
官方依据与版本边界
官方变更页:https://developer.huawei.com/consumer/cn/doc/doccenter-release-notes/js-apidiff-arkweb-7003
- ArkWeb 在 API 26 增加 enableMediaNetworkProxy。
- 媒体请求是否走代理需要显式配置。
- 普通 fetch 成功不能证明媒体流已走同一路径。
- 切换策略后需要重新验证播放与证书错误。
本文依据 HarmonyOS 7.0.0 Release(API 26)官方变更说明梳理接口,并对状态模型、分支选择和异常映射做了宿主侧 TypeScript 测试。当前本机 SDK 为 API 24,且没有连接 HDC 设备,因此不把示例描述为 API 26 编译通过、真机性能数据或上架审核结论。接入前请在 API 26 工程中按文末清单完成编译、设备与回归验证。
可复用的 ArkTS 集成片段
type ProxyMode = 'direct' | 'media-proxy' | 'fallback-direct'
+
+export class MediaProxyPolicy {
+ private mode: ProxyMode = 'direct'
+
+ async apply(controller: webview.WebviewController, enabled: boolean) {
+ try {
+ controller.enableMediaNetworkProxy(enabled)
+ this.mode = enabled ? 'media-proxy' : 'direct'
+ } catch (error) {
+ this.mode = 'fallback-direct'
+ hilog.error(0x1200, 'MediaProxy', 'apply failed: %{public}s', String((error as BusinessError).code))
+ }
+ AppStorage.setOrCreate('mediaProxyMode', this.mode)
+ }
+
+ getMode() { return this.mode }
+}
+
+// 对照请求:普通 JSON 与同域媒体分片都要出现在代理证据中
+const probes = ['/api/recipe/42', '/media/recipe-42/segment-001.m4s']
代码刻意把平台调用和业务状态分开:平台返回什么就记录什么,页面只消费稳定状态。接入时还应补齐项目的日志域、错误码类型和生命周期释放。

图中的每条箭头都应对应一条可查询日志:输入、平台调用、状态映射、UI 或降级结果。只有 UI 变化而没有中间证据,后续仍然难以区分接口失败和页面逻辑错误。
复现与验证
- 准备同域 JSON 接口和分片视频作为对照。
- 关闭媒体代理,分别记录普通请求与分片日志。
- 开启 enableMediaNetworkProxy 后重新加载页面。
- 核对代理日志、播放器错误、证书信息和当前 ProxyMode。
- 关闭代理再测一轮,确认配置可逆且无悬挂状态。
| 输入/场景 | 预期分支 | 验收信号 |
|---|---|---|
| 直连+普通请求 | 可见 | 建立基线 |
| 直连+媒体分片 | 代理不可见 | 符合基线 |
| 开启媒体代理 | 两类均可见 | 目标状态 |
| 代理不可达 | fallback-direct | 状态可解释 |
| 证书错误 | 播放失败并记录 | 不吞错 |
| 关闭媒体代理 | 恢复直连 | 策略可逆 |
取舍与落地清单
媒体代理适合调试和明确的网络策略,不应默认对所有用户打开。代理会改变链路、证书和性能特征,必须把模式、失败回退和关闭路径一起交付。
- 已用 API 26 工程编译,并记录 SDK 与设备版本
- 已覆盖“开发环境抓包”和“企业网络出口”两类行为
- 已记录成功、失败、降级三条路径的输入与结果
- 已核对监听、对象或任务的释放与幂等行为
- 已把本文宿主测试替换为项目自己的真机证据
小结
一个 MediaProxyPolicy、媒体/普通请求对照测试、切换时序和回归表,帮助证明媒体流是否真正经过代理。。建议先在最小页面复现,再接入完整“中式美食”流程;先证明状态链正确,再谈动画、缓存或埋点优化。
更多推荐


所有评论(0)