diff --git a/feature_bridge/src/main/ets/core/MessageCodec.ets b/feature_bridge/src/main/ets/core/MessageCodec.ets index 7028204..78413bf 100644 --- a/feature_bridge/src/main/ets/core/MessageCodec.ets +++ b/feature_bridge/src/main/ets/core/MessageCodec.ets @@ -48,12 +48,33 @@ export class MessageCodec { for (const o of arr) { const m = new Message(); m.handlerName = o.handlerName; - m.data = o.data; + // data/responseData:H5 可能直接传对象(如 SwitchOverGameData)。Android org.json + // getString 会把嵌套对象强制转成 JSON 字符串,handler 再 JSON.parse;这里复刻该语义, + // 否则对象原样传到 handler 后 JSON.parse(对象) 会得到 "[object Object]" 而解析失败。 + m.data = MessageCodec.coerceToString(o.data); m.callbackId = o.callbackId; m.responseId = o.responseId; - m.responseData = o.responseData; + m.responseData = MessageCodec.coerceToString(o.responseData); list.push(m); } return list; } + + /** + * 复刻 Android org.json `getString` 对 data/responseData 的取值语义: + * 字符串原样返回;对象/数组转紧凑 JSON 字符串;数字/布尔转其字符串;null/缺省返回 undefined。 + */ + private static coerceToString(v: Object | undefined): string | undefined { + if (v === undefined || v === null) { + return undefined; + } + const t: string = typeof v; + if (t === 'string') { + return v as string; + } + if (t === 'object') { + return JSON.stringify(v); + } + return String(v); + } } diff --git a/feature_capabilities/src/main/ets/providers/NavProvider.ets b/feature_capabilities/src/main/ets/providers/NavProvider.ets index 66f660c..f48a480 100644 --- a/feature_capabilities/src/main/ets/providers/NavProvider.ets +++ b/feature_capabilities/src/main/ets/providers/NavProvider.ets @@ -60,7 +60,9 @@ export class NavProvider implements CapabilityProvider { this.log.w(`SwitchOverGameData bad json: ${(e as Error).message}`); return; } - const payload: SwitchGamePayload = { webtype: req.webtype, dir: req.Gamedirectory, data: req.data }; + // webtype 契约为 "2"竖/"3"横,但 H5 可能发数字(如 3)。统一转字符串, + // 否则下游 `webtype !== '2'` 的严格比较对数字恒为真,会把竖屏子游戏错误强制横屏。 + const payload: SwitchGamePayload = { webtype: String(req.webtype), dir: req.Gamedirectory, data: req.data }; EventBus.emit(NavEvents.SWITCH_GAME, payload); }