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:
co-authored by
Claude Opus 4.7
parent
5b67e414b3
commit
0427bb9542
+23
-12
@@ -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 可从子游戏 push,pop 回子游戏时需要 callback 子游戏 H5 的 getWebdata;
|
||||
与大厅 / 子游戏的 viewWillAppear/Disappear 生命周期对齐,栈顶才挂钩避免双发)
|
||||
|
||||
#### 验收
|
||||
|
||||
@@ -942,11 +952,12 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
|
||||
- [x] 6.7 SubGameDownloader(actor,URLSession + 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 个 WKScriptMessageHandler(ScriptMessageProxy 切断 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user