iOS replaykit ,why didn`t have callback when user select "don`t allow " to record screen in ReplayKit

86 Views Asked by At

enter image description here

recently i found when user select the last one item [dont allow],but didnt have any callback tell me ,cause the developer don`t konw which one user select it.

static private func startCapture(callback:@escaping(_ code:ScreenCheckStatus,_ msg:String) ->Void) {
        RPScreenRecorder.shared().isMicrophoneEnabled = true
        isCheckAuthAlreadStop = false
        startListenRefuseRecord(callback: callback)
        ///startCapture(handler captureHandler: ((CMSampleBuffer, RPSampleBufferType, Error?) -> Void)?) async throws
        RPScreenRecorder.shared().startCapture { buffer, bufType, error in
            if error != nil {
                callback(.startRecordError,error!.localizedDescription)
            }else{
                self.stopListenRefuseRecord()
                if buffer.isValid && CMSampleBufferDataIsReady(buffer) == true && !self.isCheckAuthAlreadStop{
                    self.stopCapture(callback: callback)
                    self.isCheckAuthAlreadStop = true
                }
            }
        }
    }

    static private func startListenRefuseRecord(callback:@escaping(_ code:ScreenCheckStatus,_ msg:String) ->Void) {
        ScreenCheck.isUserRefuseRecord = false
        let publisher1 = RPScreenRecorder.shared().publisher(for: \.isRecording)
        let publisher2 = RPScreenRecorder.shared().publisher(for: \.isMicrophoneEnabled)
        let cancelBag = Subscribers.Sink<Bool, Never>(receiveCompletion: { complete in
        }, receiveValue: {value in
            if !ScreenCheck.isUserRefuseRecord && value{
                ScreenCheck.isUserRefuseRecord = true
                callback(.resufeRecordError,"用户拒绝屏幕录制,请重新启动app,否则将导致屏幕录制失败")
                ScreenCheck.stopListenRefuseRecord()
            }
        })
        let latest = Publishers.CombineLatest(publisher1, publisher2)
            .throttle(for: 2, scheduler: RunLoop.main, latest: true)
            .map{ !$0 && !$1}
        latest.subscribe(cancelBag)
        self.userRefuseRecordCancelBag = cancelBag
    }

how to konw why the replaykit don`t give callback when use select limits of authority ,and how to solve this problem ?

1

There are 1 best solutions below

6
Paulw11 On

If the user declines screen recording then you will get a userDeclined error passed to your handler.

RPScreenRecorder.shared().startRecording() { error in
   if let error = error as? NSError {
      if error.domain == RPRecordingErrorDomain && error.code == RPRecordingErrorCode.userDeclined.rawValue {
          print("User declined screen recording")
      } else {
          print(error)
      }
    } else {
        print("No error")
    }
}

With startCapture the code is very similar; The error is reported to the completionHandler closure:

RPScreenRecorder.shared().startCapture( handler: { buffer, bufferType, error in
            //...
    },
    completionHandler: { error in
        if let error = error as? NSError {
            if error.domain == RPRecordingErrorDomain && error.code == RPRecordingErrorCode.userDeclined.rawValue {
               print("User declined screen recording")
            } else {
               print(error)
            }
       } else {
            print("No error")
       }
   })