diff --git a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift index ac0605e..124dc07 100644 --- a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift +++ b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift @@ -85,16 +85,39 @@ public enum RemoteAudioHandler { isSubGame: Bool, callback: BridgeCallback? ) async { - // 1. 麦克风权限请求 - let granted: Bool = await withCheckedContinuation { cont in - AVAudioSession.sharedInstance().requestRecordPermission { ok in - cont.resume(returning: ok) - } - } - guard granted else { - // 拒绝:弹 Alert + 不触发 callback(对齐 daoqi NewRootVC.m:314-319) + // 1. 麦克风权限**只读**状态检查(对齐 daoqi FuncPublic.m:1144-1170 ifauth 实现)。 + // 主动请求权限(requestRecordPermission)会立即弹出 iOS 系统对话框; + // 在 H5 按住状态下弹系统对话框 → 用户必须松手点"允许" → + // RecordingAwareWindow.touchObserver 捕获松手立刻 stop → 浮层瞬间关闭, + // 用户体验异常(首次启动 app 录音永远失败)。 + let status = AVCaptureDevice.authorizationStatus(for: .audio) + switch status { + case .denied, .restricted: + // 明确拒绝 → 弹 Alert + 不触发 cb(对齐 daoqi NewRootVC.m:314-319) showMicrophonePermissionAlert(on: hostVC()) return + + case .notDetermined: + // 首次启动:弹系统权限对话框,**不**启动录音浮层(避免与 touchObserver + // 死锁)。用户做完选择 / 第二次按录音按钮时走 .authorized 分支正常录音。 + // + // ⚠️ daoqi ifauth 在 .notDetermined 时返回 1(继续录音),但 daoqi 用 + // NotificationCenter 全局监听,行为可能与新外壳的 touchObserver 不一致; + // 经实测新外壳走 daoqi 老路径会"按一次没反应"——改用先请求权限再 return + // 的策略,等价于 "第一次按录音按钮 = 触发权限请求;第二次按 = 正常录音"。 + _ = await withCheckedContinuation { cont in + AVAudioSession.sharedInstance().requestRecordPermission { granted in + cont.resume(returning: granted) + } + } + // 无论用户允许/拒绝都不触发 cb(H5 端会因没收到 cb 知道本次录音未发生) + return + + case .authorized: + break // 继续启动录音 + + @unknown default: + return } // 2. 启动录音浮层