使用KVO监听AVAudioSession的recordPermission无响应问题排查
解决AVAudioSession麦克风权限变更无法通过KVO监听的问题
你的问题核心在于AVAudioSession的recordPermission属性并不支持KVO监听,苹果官方并未将该属性设计为KVO兼容的,所以即使添加了观察者,权限变更时也不会收到回调事件。
替代解决方案
方案1:通过应用生命周期通知主动检查权限
利用应用激活/进入前台的通知,定期主动查询麦克风权限状态,这是最可靠的通用方案:
private var permissionObserver: NSObjectProtocol? private func setupRecordPermissionMonitoring() { // 监听应用激活通知,每次前台激活时检查权限 permissionObserver = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in self?.checkRecordPermission() } // 初始化时先检查一次 checkRecordPermission() } private func checkRecordPermission() { let status = AVAudioSession.sharedInstance().recordPermission print("当前麦克风权限状态:\(status)") switch status { case .granted: // 权限已授权,执行对应逻辑 break case .denied: // 权限被拒绝,提示用户去设置开启 break case .undetermined: // 未申请权限(若权限由其他框架处理,此情况可忽略) break @unknown default: break } } // 记得在合适的时机移除观察者(比如deinit) deinit { if let observer = permissionObserver { NotificationCenter.default.removeObserver(observer) } }
方案2:与权限申请框架协作,监听自定义通知
如果有权限申请框架的修改权限,可以让框架在权限变更后发送自定义通知,主应用监听该通知实现实时响应:
框架侧代码(权限申请后发送通知):
AVAudioSession.sharedInstance().requestRecordPermission { granted in // 发送自定义权限变更通知 NotificationCenter.default.post( name: NSNotification.Name(rawValue: "RecordPermissionDidUpdate"), object: granted ) }
主应用侧代码(监听自定义通知):
private var customPermissionObserver: NSObjectProtocol? private func setupCustomPermissionMonitoring() { customPermissionObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "RecordPermissionDidUpdate"), object: nil, queue: .main) { [weak self] notification in guard let granted = notification.object as? Bool else { return } print("麦克风权限变更:\(granted ? "已授权" : "被拒绝")") // 执行你的业务逻辑 } } // 移除观察者 deinit { if let observer = customPermissionObserver { NotificationCenter.default.removeObserver(observer) } }
关键说明
- 不要依赖KVO监听
recordPermission,苹果未承诺该属性的KVO兼容性,未来系统版本也不会对此提供支持。 - 方案1适用于无法修改权限框架的场景,能保证在应用每次回到前台时获取最新权限状态;方案2则能实现更实时的权限变更响应,但需要框架配合。
内容的提问来源于stack exchange,提问作者Trieu Nguyen
相关产品推荐
相关产品推荐

