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:
joywayer
2026-06-24 01:56:52 +08:00
parent 97749ac177
commit 530309c258
@@ -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: