diff --git a/ylgamehall/Source/Bridge/BridgeProtocol.swift b/ylgamehall/Source/Bridge/BridgeProtocol.swift index 54f589b..3318f34 100644 --- a/ylgamehall/Source/Bridge/BridgeProtocol.swift +++ b/ylgamehall/Source/Bridge/BridgeProtocol.swift @@ -109,6 +109,27 @@ extension BridgeData { return nil } + /// 宽松字符串:string 保持原样、number 自动转 String、bool 转 "true"/"false"。 + /// + /// 用于 H5 字段类型不严格的场景(如 mediaTypeAudio.user 实际可能传 number + /// 0/1/userId 或 string)。对齐 daoqi `[NSString stringWithFormat:@"%@", + /// data[@"user"]]` 的容忍行为—— ObjC `%@` 对 NSNumber 调用 description 自动 + /// 转字符串。 + nonisolated public var asLooseString: String? { + switch self { + case .string(let s): return s + case .number(let d): + // 整数样的 double 转 Int 字符串(如 0.0 → "0",避免无意义的 .0 尾巴) + if d == d.rounded(), d.isFinite, abs(d) < Double(Int.max) { + return String(Int(d)) + } + return String(d) + case .bool(let b): return b ? "true" : "false" + case .null: return nil + case .array, .object: return nil + } + } + nonisolated public var asDouble: Double? { if case .number(let d) = self { return d } return nil diff --git a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift index 2f2f50c..e2c788f 100644 --- a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift +++ b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift @@ -247,11 +247,14 @@ public enum RemoteAudioHandler { bridge: any BridgeProtocol, callback: BridgeCallback? ) async { - // 1. 解析入参(只有 audiourl + user 两个字段,对齐 daoqi - // NewRootVC.m:326-328 / gameController.m:435-437) + // 1. 解析入参(核心字段 audiourl + user,对齐 daoqi NewRootVC.m:326-328 / + // gameController.m:435-437;H5 实测也会带 type 字段但 daoqi 注释掉、不用)。 + // + // ⚠️ user 字段在 H5 实测中是 number(如 0、12345),不是 string;用 + // asLooseString 兼容两种类型(对齐 daoqi `%@` 格式化容忍 NSNumber 行为) guard let obj = data?.asObject, let urlString = obj["audiourl"]?.asString, - let user = obj["user"]?.asString, + let user = obj["user"]?.asLooseString, let downloadURL = URL(string: urlString) else { log.error("mediaTypeAudio: bad params \(String(describing: data), privacy: .public)")