3.E 修复:notDetermined 路径触发 cb 让 H5 释放业务锁
## 问题
用户首次点击录音 → 弹权限对话框 → 用户允许 → 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 错误。
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user