修复定位的回调问题

This commit is contained in:
joywayer
2026-08-07 12:18:44 +08:00
parent 3f8b382ad3
commit 1203957924
12 changed files with 637 additions and 180 deletions
+51 -2
View File
@@ -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 是 NSNumberJSON 看是数字 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
{