# H5 调试指南(Safari Web Inspector) > **定位**:本文档面向开发者,描述开发期调试 H5(大厅 / 子游戏 / 弹层)网页输出的标准方法。 > > **适用范围**:仅 Debug 编译;Release 包不受影响(详见 §6 安全性说明)。 > > **不在本文档范围内**: > - 桥接接口契约 → `H5-Native-Contract.md` > - 业务功能验收清单 → `Verification-Checklist.md` > - 原生 `os.log` 日志查看(直接看 Xcode 底部输出窗口即可) --- ## 1. 原理与适用范围 WebKit 自 iOS 16.4 起把 `WKWebView` 的网页检查器开关收敛到了 `isInspectable` 属性,**默认关闭**。打开后,该 `WKWebView` 加载的页面会被 Mac Safari 的"开发"菜单识别为可调试目标,等价于在浏览器里按 F12 打开 DevTools,能力包括: - **Console**:`console.log/info/warn/error/trace` 全部可见;可在控制台中直接 `evaluate` JS 表达式 - **Sources**:查看 H5 包内所有 .js / .html / .css 源码;下断点、单步、Watch 表达式 - **Network**:所有 XHR / fetch / 图片 / 字体请求,请求头/响应/Timing 全可见(含 `file://` 本地资源) - **Elements**:DOM 树、计算后样式、动画检视 - **Storage**:localStorage / sessionStorage / Cookies / IndexedDB - **Timelines**:CPU / 渲染 / 网络时间线 **与 Xcode 控制台关系**:Safari Web Inspector 看的是 H5 网页里的 console(JS 端运行结果);Xcode 控制台看的是原生 Swift `print` / `os.log` 输出。两者互补。 --- ## 2. 工程内的代码改动(已落地,无需重做) 代码侧已经在两处 `WKWebView` 创建点加好了 `#if DEBUG` 守卫的 inspectable 开关: - `ylgamehall/Source/WebView/BridgedWebView.swift` :大厅 / 子游戏共用的 `WKWebView` - `ylgamehall/Source/WebView/OverlayViewController.swift` :弹层(msext `threeView` 等价容器)的 `WKWebView` 补丁形态(两处一致): ```swift let webView = WKWebView(frame: .zero, configuration: configuration) #if DEBUG if #available(iOS 16.4, *) { webView.isInspectable = true } #endif ``` **重要约束**: - **`#if DEBUG` 守卫不可去除** —— Release 包绝对不能让生产 IPA 暴露 Web Inspector,避免被外部审阅 JS 源码 / Storage / 注入表达式 - **`@available(iOS 16.4, *)` 兼容守卫不可去除** —— 本项目最低 iOS 15.6,低于 16.4 的设备走 `else` 分支(即不开启 inspectable),新设备才走真路径 - 新增任何第 4 个 `WKWebView` 创建点时,**同样补这 6 行**,否则该 WebView 在 Safari 里看不到 --- ## 3. 前置准备 ### 3.1 Xcode 端 确认 Scheme Run 配置是 Debug(默认就是): - 菜单 **Product → Scheme → Edit Scheme...**(`⌘<`)→ 左侧 **Run** → 右侧 **Info** 标签页 - **Build Configuration = Debug** ✅ ### 3.2 Mac Safari 端(一次性) 1. Safari 顶部 → **Safari → 设置(`⌘,`)→ 高级** 2. 勾选最下方 **"在菜单栏中显示开发菜单"** 3. 关闭设置窗口,菜单栏出现"开发"项 ### 3.3 真机端(一次性,仅真机需要;模拟器跳过) iPhone 上:**设置 → Safari → 高级 → 网页检查器 = 开**。 > ⚠️ 这个"网页检查器"开关与 Safari 浏览器自身的网页检查无关,是 iOS 18+ 起 Apple 把 `WKWebView` 的可检视性也纳入了这个开关。**如果不开,Mac Safari 的"开发"菜单里看不到该设备的 H5 页面。** --- ## 4. 标准操作流程 ### 4.1 启动 Debug build 1. Xcode 顶部 device picker → 选择目标设备/模拟器 2. `⌘R` 启动 3. 等大厅 H5 加载完成(屏幕上看到大厅 UI) ### 4.2 打开 Web Inspector Mac Safari 顶部菜单 → **开发 → [设备名] → [页面标题或 URL]** → Web Inspector 浮窗弹出。 - 模拟器:菜单层级类似 `开发 → Simulator – iPhone 16 Pro → file:///.../index.html` - 真机:`开发 → 你的 iPhone 名字 → file:///.../index.html` ### 4.3 看 console 输出 Web Inspector 顶部 tab → **Console** → 实时显示 H5 端的 `console.*` 输出 + JS 异常堆栈。 支持直接在底部输入框运行表达式,例如: ```js window.WebViewJavascriptBridge // 查看桥对象 typeof app_gameid // 查看预注入变量 bridge.callHandler('getphoneInfo', null, r => console.log(r)) // 触发桥调用 ``` ### 4.4 关闭 Web Inspector 直接关掉浮窗即可,不影响 app 运行。下次需要时重新打开。 --- ## 5. 多 WebView 场景 本项目同时存在最多 3 个 `WKWebView` 实例: | 场景 | 创建位置 | 何时存在 | |------|---------|---------| | 大厅 | `WebContainerViewController` → `BridgedWebView` | App 全程 | | 子游戏 | `SubGameViewController` → `BridgedWebView` | push 进子游戏后,pop 销毁 | | 弹层 | `OverlayViewController` 自建 `WKWebView` | present 显示中,dismiss 销毁 | Safari "开发" 菜单会把每个**已加载页面**的 `WKWebView` 列为**独立一项**。 ### 5.1 关键 gotcha:Develop 菜单不会自动刷新 ⭐ 进入子游戏 / 打开弹层之后,**已经展开过的"开发"菜单不会自动刷新**,新出现的 WebView 不会冒出来。 **做法**: - 子游戏 push / 弹层 present 完成后 - 回 Mac,**先点其它菜单**(如 文件、编辑),让"开发"菜单收起 - 再展开 **开发 → [设备名]** → 此时新 WebView 才会列出来 ### 5.2 多条目区分 如果列表里多个条目 `