如何检测用户拒绝RPScreenRecorder录屏权限请求?
解决方案:检测RPScreenRecorder录制权限拒绝状态
1. 优先主动请求录制权限(最可靠方式)
直接调用requestRecordingPermissions方法提前获取用户权限选择,无需依赖录制启动时的错误回调:
@objc func checkRecordingPermission() { guard #available(iOS 11.0, *) else { return } RPScreenRecorder.shared().requestRecordingPermissions { granted in DispatchQueue.main.async { if granted { // 用户允许权限,执行录制逻辑 self.startRecording(width: 1920, height: 1080) } else { // 用户拒绝权限,执行对应提示或处理 print("User declined application recording permission.") } } } }
2. 修正启动录制时的错误检测逻辑
如果需要在启动录制的流程中捕获权限错误,需注意两个关键点:
startCapture可能直接抛出错误,需用do-catch捕获- 错误判断需同时校验错误域和错误码,避免误判其他同码错误
修正后的startRecording方法:
@objc func startRecording(width: Int32, height: Int32) -> Bool { var res: Bool = true let recorder = RPScreenRecorder.shared() guard #available(iOS 11.0, *) else { return false } do { try recorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in guard error == nil else { self.handleRecordingError(error!) res = false return } // 处理录制的采样缓冲数据 }) } catch { self.handleRecordingError(error) res = false } return res } private func handleRecordingError(_ error: Error) { let rpError = error as NSError guard rpError.domain == RPRecordingErrorDomain else { print("Non-recording error: \(rpError.localizedDescription)") return } switch RPRecordingErrorCode(rawValue: rpError.code) { case .userDeclined: print("User declined application recording permission.") case .failedToStart: print("Failed to start recording.") default: print("Recording error: \(rpError.localizedDescription)") } }
原代码未触发错误回调的原因
- 权限拒绝的错误可能直接在
startCapture调用时抛出,而非通过handler返回,原代码未用do-catch捕获这部分错误 - 仅校验错误码未校验错误域,可能忽略了系统返回的正确权限拒绝错误
内容的提问来源于stack exchange,提问作者jdevp2
相关产品推荐
相关产品推荐

