本文档定义当前项目中 原生小程序 与 H5 定制内容页 之间的基础通信协议。
目标:
本规范当前属于:
最近排查已经确认,当前最初使用的是个人主体小程序。
在这个前提下,web-view 能力本身可能受限。
因此:
详细说明见:
建议先固定:
content-v1result-v1后续升级时:
content-v2result-v2不要直接改旧协议。
先只开放真正需要的能力,不要一开始做成“大而全总线”。
Bridge 只能做:
不能让 H5 直接改比赛核心状态。
每个请求都应有明确成功/失败返回,不允许 H5 靠超时猜测。
建议统一按“请求 / 响应 / 事件”三类消息组织:
request
H5 请求原生能力response
原生返回能力执行结果event
原生主动推送状态变化推荐消息外壳:
{
"id": "req-001",
"channel": "request",
"type": "getGameContext",
"payload": {}
}
响应:
{
"id": "req-001",
"channel": "response",
"type": "getGameContext",
"ok": true,
"payload": {}
}
建议至少包含:
{
"bridgeVersion": "content-v1",
"eventId": "sample-score-o-001",
"mode": "score-o",
"sessionId": "session-001",
"sessionStatus": "running",
"controlId": "control-3",
"controlKind": "control",
"title": "湖边步道",
"body": "这里适合短暂停留观察周边地形。",
"theme": "default-race"
}
对于结果页,可扩展为:
{
"bridgeVersion": "result-v1",
"eventId": "sample-score-o-001",
"mode": "score-o",
"sessionId": "session-001",
"summary": {
"title": "比赛结束",
"heroValue": "120",
"rows": []
}
}
建议第一阶段只支持这几个:
close作用:
示例:
{
"id": "req-001",
"channel": "request",
"type": "close",
"payload": {}
}
getGameContext作用:
takePhoto作用:
recordAudio作用:
submitResult作用:
示例:
{
"id": "req-002",
"channel": "request",
"type": "submitResult",
"payload": {
"taskId": "photo-task-1",
"status": "completed",
"assetId": "img-001"
}
}
等第一阶段跑稳后,再逐步加入:
uploadImageuploadAudiogetLocationopenMiniGamesubmitFormsharerestartSession这些先不要第一阶段全开。
建议统一返回:
{
"id": "req-002",
"channel": "response",
"type": "takePhoto",
"ok": true,
"payload": {
"assetId": "img-001",
"url": "https://example.com/assets/img-001.jpg"
}
}
失败时:
{
"id": "req-002",
"channel": "response",
"type": "takePhoto",
"ok": false,
"error": {
"code": "USER_CANCELLED",
"message": "用户取消拍照"
}
}
原生可按需主动推送轻量事件:
contextUpdatedsessionFinishedsessionExitednetworkChanged但第一阶段要克制,避免高频推送。
不建议第一阶段主动高频推:
这些不适合让 H5 主导。
建议第一阶段统一几类错误:
USER_CANCELLEDPERMISSION_DENIEDNETWORK_ERRORUNSUPPORTED_ACTIONBRIDGE_NOT_READYINTERNAL_ERROR这样 H5 侧更容易统一处理。
H5 不能直接决定:
原生决定是否执行:
例如:
takePhoto后续可做按 bridgeVersion 或 pageType 的能力白名单。
建议第一阶段只正式支持:
closegetGameContexttakePhotorecordAudiosubmitResult这样足够承接:
先不要一上来开放:
这些都属于核心状态,应该继续由原生掌控。
content-v1Bridge 的第一阶段目标,不是做成万能总线,而是:
稳定承接定制内容页与结果页的最小需求。
先把:
这 5 条做稳,就足够支撑第一波客户定制需求。