Phase 7 完整实现:OpenurlTitleData 弹层(OverlayViewController + 3 个 settings)

- AppCoordinator 扩 OverlayRequest + lastOverlayAt(3s 节流 / 栈深 < 3 守门) +
  showOverlay / popOverlay(data==nil 仅 pop 即 finishweb 路径;
  data!=nil 同时发 .subGameDidReturn 即 backgameData 路径)
- 新增 Source/WebView/OverlayViewController.swift:独立 WKWebView,
  WKWebViewConfiguration.websiteDataStore = .nonPersistent() 隔离 Cookie / 缓存;
  .atDocumentEnd 注入 polyfill:window.settings = {browser/finishweb/backgameData}
  → webkit.messageHandlers.<name>(与 WVJB 不同 channel 可同名共存);
  ScriptMessageProxy weak target 切断 retain cycle
- OpenurlTitleDataHandler 升级为真实 push:解 url / "title "(末尾空格契约)/
  data / orientation → AppCoordinator.showOverlay,cb 字面始终回 "OpenurlTitleData"
- SubGameViewController.setupExternalSubscriptions 也订阅 .subGameDidReturn
  (overlay 可从子游戏 push,pop 回子游戏时需要 callback 子游戏 H5 的 getWebdata;
  与 viewWillAppear/Disappear 生命周期对齐,栈顶才挂钩避免双发)
- orientation 字段保留契约但 landscape-only app 暂不实施旋转(msext 旋转 transform
  在我们项目里无意义,记注释,如有 H5 反馈再补)
- Plan §5.7.1-7.7 / §8 进度已勾选

至此 SwitchOverGameData → push 子游戏 / OpenurlTitleData → push 弹层 / backgameData ↔
finishweb → pop + getWebdata 反向闭环全部接通。栈深永远 ≤ 3。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 21:30:03 +08:00
co-authored by Claude Opus 4.7
parent 5b67e414b3
commit 0427bb9542
5 changed files with 332 additions and 23 deletions
+23 -12
View File
@@ -634,13 +634,23 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
#### 任务清单
- [ ] **7.1** `Source/Containers/OverlayViewController.swift`继承 WebContainer,但 WKWebsiteDataStore `.nonPersistent()` 隔离
- [ ] **7.2** `Source/WebView/OverlayBridge.swift` polyfill JS`window.settings = {backgameData, browser, finishweb}``webkit.messageHandlers.*`
- [ ] **7.3** `WKScriptMessageHandler` 注册三 handler`overlayBackgameData` / `overlayBrowser` / `overlayFinishweb`
- [ ] **7.4** `OpenurlTitleData` handler(大厅 + 子游戏都注册):解参(注意 `"title "` 末尾空格契约) → AppCoordinator.showOverlay → 3 秒节流
- [ ] **7.5** Overlay backgameData → 发 `.subGameDidReturn` → 上层 H5 收 `getWebdata`
- [ ] **7.6** Overlay `finishweb` → coordinator.popOverlay
- [ ] **7.7** Overlay `browser` → 系统 Safari 打开
- [x] **7.1** `Source/WebView/OverlayViewController.swift`独立 WKWebView`WKWebViewConfiguration.websiteDataStore = .nonPersistent()`
隔离弹层 Cookie / 缓存(不污染大厅 / 子游戏会话)
- [x] **7.2** polyfill JS 内联(不抽独立 .js 文件):`.atDocumentEnd` 注入
`window.settings={browser,finishweb,backgameData}` `webkit.messageHandlers.*`
msext threeView.m:223-241 在 webViewDidFinishLoad 注入 `context[@"settings"]=jo` 等价时机)
- [x] **7.3** `WKScriptMessageHandler` 通过 `ScriptMessageProxy`weak target 切断 retain cycle
注册 3 handler`browser` / `finishweb` / `backgameData`messageHandler 与 WVJB 不同 channel
可与大厅 WVJB 同名共存不冲突)
- [x] **7.4** `OpenurlTitleData` handler(大厅 + 子游戏都注册):解参(`"title "` 末尾空格契约硬约束) →
`AppCoordinator.showOverlay` → 3 秒节流由 Coordinator 守门(msext first_Time 等价)
- [x] **7.5** Overlay backgameData → `AppCoordinator.popOverlay(returningData:)` → 发 `.subGameDidReturn`
→ 父层(大厅 / 子游戏)观察后 callback H5 `getWebdata`
- [x] **7.6** Overlay `finishweb``popOverlay(returningData: nil)` 仅 pop 不发通知
- [x] **7.7** Overlay `browser``UIApplication.shared.open` Safari 外链
- [x] **额外**SubGameViewController.setupExternalSubscriptions 也订阅 `.subGameDidReturn`
overlay 可从子游戏 pushpop 回子游戏时需要 callback 子游戏 H5 的 getWebdata
与大厅 / 子游戏的 viewWillAppear/Disappear 生命周期对齐,栈顶才挂钩避免双发)
#### 验收
@@ -942,11 +952,12 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
- [x] 6.7 SubGameDownloaderactorURLSession + ZIPFoundation + staging + 原子 rename
### Phase 7 弹层
- [ ] 7.1 OverlayViewController + 私有 dataStore
- [ ] 7.2 window.settings polyfill
- [ ] 7.3 3 个 WKScriptMessageHandler
- [ ] 7.4 OpenurlTitleData handler"title " 末尾空格)
- [ ] 7.5 Overlay backgameData
- [x] 7.1 OverlayViewController + 私有 dataStore.nonPersistent
- [x] 7.2 window.settings polyfill.atDocumentEnd 注入)
- [x] 7.3 3 个 WKScriptMessageHandlerScriptMessageProxy 切断 retain cycle
- [x] 7.4 OpenurlTitleData handler"title " 末尾空格 + 3s 节流由 Coordinator 守门
- [x] 7.5 Overlay backgameData(→ popOverlay 发 .subGameDidReturn → 父层 getWebdata
- [x] 额外 SubGameViewController 也订阅 .subGameDidReturn(覆盖 overlay→sub-game 返回)
- [ ] 7.6 Overlay finishweb
- [ ] 7.7 Overlay browser