From 530309c2584a47bf7cd26066a1184c59e4b4c577 Mon Sep 17 00:00:00 2001 From: joywayer Date: Wed, 24 Jun 2026 01:56:52 +0800 Subject: [PATCH] =?UTF-8?q?3.E=20=E4=BF=AE=E5=A4=8D=EF=BC=9AnotDetermined?= =?UTF-8?q?=20=E8=B7=AF=E5=BE=84=E8=A7=A6=E5=8F=91=20cb=20=E8=AE=A9=20H5?= =?UTF-8?q?=20=E9=87=8A=E6=94=BE=E4=B8=9A=E5=8A=A1=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题 用户首次点击录音 → 弹权限对话框 → 用户允许 → H5 整体无法再点击。 ## 根因 我上次修复让 .notDetermined 分支 return 时不触发 cb,违反 daoqi 行为: daoqi NewRootVC.m:322 在 ifauth==1(NotDetermined)路径下走录音流程并 **立即触发 responseCallback**。 H5 业务在 callHandler('prepareaudio') 调用后通常会上"录音中"业务锁 (加触摸遮罩、禁用按钮等),等收到 cb 才解锁。系统权限对话框已经把 H5 的 in-flight touch 打断为 touchcancel,H5 业务的 touchcancel 处理 可能不完善 → 业务锁不释放 → 整个 H5 后续无法点击。 ## 修复 .notDetermined 分支权限请求完成后**仍然触发 cb**: ```swift case .notDetermined: _ = await requestRecordPermission() callback?(.string("Response from prepareaudio")) // ← 触发 cb return ``` H5 收到 cb 释放业务锁,整个 H5 恢复可点击。本次实际未录音 → 无后续 getaudiourl,H5 按"无 getaudiourl 的失败路径"走(与 daoqi 转码失败 silent 路径等价)。用户第二次按录音按钮走 .authorized 分支正常录音。 ## 验证 BuildProject 通过 0 错误。 --- .../Bridge/Handlers/RemoteAudioHandler.swift | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift index 124dc07..ff35b3f 100644 --- a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift +++ b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift @@ -99,18 +99,24 @@ public enum RemoteAudioHandler { case .notDetermined: // 首次启动:弹系统权限对话框,**不**启动录音浮层(避免与 touchObserver - // 死锁)。用户做完选择 / 第二次按录音按钮时走 .authorized 分支正常录音。 - // - // ⚠️ daoqi ifauth 在 .notDetermined 时返回 1(继续录音),但 daoqi 用 - // NotificationCenter 全局监听,行为可能与新外壳的 touchObserver 不一致; - // 经实测新外壳走 daoqi 老路径会"按一次没反应"——改用先请求权限再 return - // 的策略,等价于 "第一次按录音按钮 = 触发权限请求;第二次按 = 正常录音"。 + // 死锁——touchObserver 会捕获用户松手点"允许"的动作立刻 stop 录音)。 + // 用户做完选择 / 第二次按录音按钮时走 .authorized 分支正常录音。 _ = await withCheckedContinuation { cont in AVAudioSession.sharedInstance().requestRecordPermission { granted in cont.resume(returning: granted) } } - // 无论用户允许/拒绝都不触发 cb(H5 端会因没收到 cb 知道本次录音未发生) + // ⚠️ 必须触发 cb(对齐 daoqi ifauth==1 路径行为,daoqi NewRootVC.m:322 + // 在 [recorderVC beginRecordByFileName:] 后总是 responseCallback)。 + // + // 不触发 cb 的后果:H5 业务在 callHandler 调用后通常会上"录音中"业务锁 + // (加触摸遮罩、禁用按钮等),等收到 cb 才解锁。系统权限对话框已经把 + // H5 的 in-flight touch 打断为 touchcancel,H5 业务的 touchcancel 处理 + // 可能不完善 → 业务锁不释放 → 整个 H5 后续无法点击。 + // + // 触发 cb 让 H5 释放业务锁,即使本次实际未录音也无害(H5 会按"无 + // getaudiourl"的失败路径走,与 daoqi 转码失败 silent 路径等价)。 + callback?(.string("Response from prepareaudio")) return case .authorized: