Phase 8.4:PhoneStateMonitor → phonestate 反向 callback
契约 §3.1 [14]phonestate 落地。msext 用已废弃的 CTCallCenter(iOS 10+
deprecated);新外壳改用 CallKit CXCallObserver,对 H5 输出字符串一致:
- "2" = 来电响铃中(hasConnected=false / isOutgoing=false / hasEnded=false)
或已连接(hasConnected=true)
- "0" = 挂断(hasEnded=true)
- 其它(拨出未连接、保持)不发
新增:
- Source/Resource/PhoneStateMonitor.swift(@MainActor singleton,与 BatteryMonitor /
NetworkMonitor 同款 pattern;onChange closure + start/stop 生命周期)
接入:
- SubGameViewController.setupExternalSubscriptions:start + onChange
- SubGameViewController.teardownExternalSubscriptions:onChange=nil + stop
- 大厅 WebContainerViewController 不订阅(msext gameController 同款边界,
契约表注「已注释」表示大厅不发;H5 子游戏才依赖此事件做哑麦/暂停)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
8fc37b0827
commit
ded6b5d86b
@@ -218,6 +218,8 @@ public final class SubGameViewController: UIViewController {
|
||||
NetworkMonitor.shared.start()
|
||||
BatteryMonitor.shared.start()
|
||||
AppLifecycleObserver.shared.start()
|
||||
// 仅子游戏挂电话状态监听(大厅不订阅,与 msext gameController 同款边界)
|
||||
PhoneStateMonitor.shared.start()
|
||||
|
||||
let bridge = bridgedWebView.bridge
|
||||
let webView = bridgedWebView.webView
|
||||
@@ -244,6 +246,11 @@ public final class SubGameViewController: UIViewController {
|
||||
bridge.call("appservice", data: .string("2"), callback: nil)
|
||||
}
|
||||
|
||||
// 电话状态 — 契约 §3.1 [14]:来电 "2" / 挂断 "0"
|
||||
PhoneStateMonitor.shared.onChange = { state in
|
||||
bridge.call("phonestate", data: .string(state), callback: nil)
|
||||
}
|
||||
|
||||
// overlay(Phase 7)pop 回子游戏时反向 callback getWebdata。挂在子游戏栈顶
|
||||
// 期间生效;overlay push 上来时 viewWillDisappear → teardown 自动解绑,避免双发。
|
||||
subGameReturnObserver = NotificationCenter.default.addObserver(
|
||||
@@ -263,6 +270,8 @@ public final class SubGameViewController: UIViewController {
|
||||
NetworkMonitor.shared.onChange = nil
|
||||
AppLifecycleObserver.shared.onBackground = nil
|
||||
AppLifecycleObserver.shared.onForeground = nil
|
||||
PhoneStateMonitor.shared.onChange = nil
|
||||
PhoneStateMonitor.shared.stop()
|
||||
|
||||
if let token = subGameReturnObserver {
|
||||
NotificationCenter.default.removeObserver(token)
|
||||
|
||||
Reference in New Issue
Block a user