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
@@ -2,14 +2,17 @@
// OpenurlTitleDataHandler.swift
// ylgamehall
//
// H5 Native handler stubOpenurlTitleData WebView threeView
// H5 Native handlerOpenurlTitleData WebView msext threeView
// docs/H5-Native-Contract.md §3.1 15
//
// Phase 7 OverlayViewController + window.settings polyfill
// + 3 stub cb H5 "no handler"
// key "title " msext
// `data["title "]?.asString` `data["title"]?.asString`
// H5 callHandler `{"title ": "..."}`
//
// key "title " msext
// obj["title "]?.asString obj["title"]?.asString
// msext NewRootVC.m / gameController.m
// - + msext
// - 3 AppCoordinator.showOverlay msext first_Time
// - callback "OpenurlTitleData"msext
//
import Foundation
@@ -20,8 +23,25 @@ public enum OpenurlTitleDataHandler {
// 15OpenurlTitleData
// url / "title " / data / orientation
// cb: "OpenurlTitleData"
// push OverlayViewController + 3 first_Time
bridge.register("OpenurlTitleData") { _, callback in
bridge.register("OpenurlTitleData") { data, callback in
await MainActor.run {
// "title " orientation landscape-only app
let url = data?["url"]?.asString ?? ""
let title = data?["title "]?.asString ?? ""
let webData = data?["data"]?.asString ?? ""
let orientation = data?["orientation"]?.asInt
?? Int(data?["orientation"]?.asString ?? "")
?? 0
let request = OverlayRequest(
url: url,
title: title,
webData: webData,
orientation: orientation
)
AppCoordinator.shared.showOverlay(request)
}
// msext / cb H5
callback?(.string("OpenurlTitleData"))
}
}