修复定位的回调问题
This commit is contained in:
@@ -616,13 +616,14 @@ H5 端无需任何改动:仍然按照"收到 `gameui_stop_voice(user)` 就停
|
||||
**表 B — `getlocationinfo`** (成功):
|
||||
```jsonc
|
||||
{
|
||||
"errorCode": 0, // ⚠️ 新外壳补齐项,msext 遗漏,见下方说明
|
||||
"address": "<完整地址>",
|
||||
"city": "<市>",
|
||||
"cityCode": "<城市编码>",
|
||||
"country": "<国>",
|
||||
"district": "<区>",
|
||||
"latitude": "30.567890", // ⚠️ string,原生 stringWithFormat:@"%f",不是 double
|
||||
"longitude": "104.123456", // ⚠️ string
|
||||
"latitude": 30.567890, // ⚠️ 数字(非字符串),6 位小数。新外壳修正项,见下方说明
|
||||
"longitude": 104.123456, // ⚠️ 数字(非字符串),6 位小数
|
||||
"province": "<省>", // ⚠️ 小写 p,与 sharelogin 的 "Province" 大写形成不一致,沿用历史
|
||||
"street": "<街道>"
|
||||
}
|
||||
@@ -632,6 +633,54 @@ H5 端无需任何改动:仍然按照"收到 `gameui_stop_voice(user)` 就停
|
||||
{ "errorCode": 12, "errorMsg": "缺少定位权限" } // errorCode 是 NSNumber,JSON 看是数字 12
|
||||
```
|
||||
|
||||
**`errorCode: 0`(成功状态码)—— 唯一一处有意偏离 msext 的定位字段**
|
||||
|
||||
msext 全工程(`grep -rn errorCode msext/Class/`)只在**失败**分支发 `errorCode: 12`
|
||||
(`gameController.m:2507` / `NewRootVC.m:2113` / 老 UIWebView 路径
|
||||
`RootVC.m:1976` / `fourviewVC.m:1518`),成功分支的 9 个字段里**没有** errorCode。
|
||||
**这是原工程的遗漏**,不是刻意设计。
|
||||
|
||||
H5 侧以 `errorCode == 0` 作为"这份定位数据有效"的判据。证据(2026-08-07 从真机沙盒
|
||||
取回的现网 H5 逐字核对):
|
||||
|
||||
| H5 包 | `05_Func.js` 日期 | 全文 `errorCode` |
|
||||
|---|---|---|
|
||||
| 子游戏 `jinxianmahjong` | 2026-07-19 | 有 2 处 —— `Func.startlocation` / `Func.getlocation` 的 `catch` 兜底桩自造定位对象时带 `"errorCode":0` |
|
||||
| 大厅 `gamehall` | 2026-02-04 | **0 处** |
|
||||
|
||||
即:较新的子游戏 H5 依赖成功包里的 `errorCode`,较老的大厅 H5 不依赖。这正是
|
||||
「大厅定位正常、子游戏拿不到定位」这一现象的成因 —— 原生成功包缺 `errorCode`
|
||||
时子游戏 H5 不认这份数据。
|
||||
|
||||
因此新外壳在成功包里补 `errorCode: 0`(JSON 数字,与失败包的 `12` 同类型)。
|
||||
对不检查该字段的大厅 H5 是多一个无害字段,不改变其行为。
|
||||
|
||||
**`latitude` / `longitude` 是数字,不是字符串 —— 第二处修正**
|
||||
|
||||
msext 的两条路径自己就不一致:
|
||||
|
||||
| msext 路径 | 代码 | JSON 形态 |
|
||||
|---|---|---|
|
||||
| WVJB / WKWebView(`gameController.m:2528`、`NewRootVC.m:2132`)| `[NSString stringWithFormat:@"%f", …]` 放进 `@{}` | **字符串** `"28.636486"` |
|
||||
| 老 UIWebView / JSContext(`RootVC.m:1998`、`fourviewVC.m:1541`)| 手拼 `\"latitude\":%f` | **数字** `28.636486` |
|
||||
|
||||
现网子游戏 H5(`jinxianmahjong` `05_Func.js:2029-2031`)兜底桩自造的定位对象写的是
|
||||
`"latitude":28.623546` —— **数字**形态。与 `errorCode` 是同一类问题:WVJB 路径当年
|
||||
把它字符串化了。新外壳按数字发。
|
||||
|
||||
实现细节:用 `BridgeData.decimal(Decimal)`(不是 `.number(Double)`)。原因是
|
||||
`JSONSerialization` 写 `Double` 会输出 17 位有效数字,`28.636486` 变成
|
||||
`28.636486000000001`;虽然 JS `JSON.parse` 出来是同一个 IEEE754 double、H5 不可分辨,
|
||||
但 JSON 文本与原工程不一致。`Decimal` 由 `String(format: "%f", …)` 构造,序列化成
|
||||
`NSDecimalNumber` → 文本 `28.636486`,与老路径 `%f` 拼串逐字节一致。
|
||||
|
||||
**这两处(`errorCode: 0`、经纬度数字)是定位链路上唯一有意偏离 msext WVJB 路径的地方**,
|
||||
其余(9 个字段名、`cityCode` 大写 C、`province` 小写 p、`street` 不带 `路` 后缀、
|
||||
失败包 `{errorCode:12, errorMsg:"缺少定位权限"}`、error 与 success 两段式发送顺序、
|
||||
任一逆地理字段为 nil 时整条不发)全部严格对齐。
|
||||
|
||||
实现:`Source/Bridge/Handlers/StartLocationHandler.swift`、`Source/Location/LocationService.swift`。
|
||||
|
||||
**表 C — `sharelogin`**:
|
||||
```jsonc
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user