为什么RPScreenRecorder不会停止录制和处理器工作?

时间:2016-04-28 13:50:04

标签: ios xcode swift wkwebview replaykit

我正在测试网站的可用性,并在本机应用中使用WKWebView。这样做的原因是我可以使用COSTouchVisualizer来显示触摸,而RPScreenRecorder则可以使用麦克风记录交互和“大声说话”。

我有以下IBAction开始录音:

@IBAction func startRecordSession(sender: AnyObject) {

    let recorder = RPScreenRecorder.sharedRecorder()

    guard recorder.available else{
        print("Cannot record the screen")
        return
    }

    recorder.delegate = self

    recorder.startRecordingWithMicrophoneEnabled(true) { (err) in

        guard err == nil else{
            if err!.code ==
                RPRecordingErrorCode.UserDeclined.rawValue{
                print("User declined app recording")
            }
            else if err!.code ==
                RPRecordingErrorCode.InsufficientStorage.rawValue{
                print("Not enough storage to start recording")
            }
            else{
                print("Error happened = \(err!)")
            }
            return
        }

        print("Successfully started recording")
        self.recordBtn.enabled = false
        self.stopRecordBtn.enabled = true
    }

}

这似乎适用于打印成功开始录制。

但是,当按下连接到IBAction以停止录制的按钮时,应运行以下代码:

@IBAction func stop() {

  let recorder = RPScreenRecorder.sharedRecorder()

  print("1. before the recorder function")// This prints

  recorder.stopRecordingWithHandler{controller, err in     

    guard let previewController = controller where err == nil else {
      self.recordBtn.enabled = true
      self.stopRecordBtn.enabled = false

      print("2. Failed to stop recording")// This does not prints

      return
    }

    previewController.previewControllerDelegate = self

    self.presentViewController(previewController, animated: true,
      completion: nil)

  }

}

但是除了打印出第一个日志(“1.录音机功能之前”)之外没有任何反应。我没有获得其他日志语句,也没有按钮切换其启用状态。

我知道IBAction因为命中声明而连接,但不知道为什么我无法触发stopRecordingWithHandler。

我正在运行iOS 9.3的iPad Pro 9.7上进行测试。

我开始怀疑它是否与尝试录制WKWebView有关,但是如果这是问题,我会想到会出错。

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

我怀疑如果你要在guard语句(stopRecordingCompletionHandler内)的任何位置设置断点,它不会使程序崩溃或进入调试器,因为else条款是永远不会调用你的guard语句。

事实上,这是预期的行为。我们不希望执行else子句,除非任何一个控制器等于nil,因此不能绑定到常量previewControllererror,因此不等于{ {1}}。

使用nil时,调用guard子句的唯一方法是指定条件为 NOT 为true。正在调用else闭包中的print语句,因为它位于startRecordingWithMicrophoneEnabled语句之外。

所以你只需要从guard子句中移出一些逻辑。你仍然希望在那里处理错误。

else

保护

因此,为了确保我们明确了recorder.stopRecordingWithHandler{controller, err in guard let previewController = controller where err == nil else { print("2. Failed to stop recording with error \(err!)") // This prints if there was an error return } } self.recordBtn.enabled = true self.stopRecordBtn.enabled = false previewController.previewControllerDelegate = self self.presentViewController(previewController, animated: true, completion: nil) print("stopped recording!") 语法,它是:

guard

在您的示例中,您将guard <condition> else { <statements to execute if <condition> is not true> } 与可选绑定和guard子句合并,以创建以下情况:

  • 如果where不是controller,则会绑定到名为nil的常量。
  • 如果是previewController,那么我们停止评估,永远不要创建常量nil,并转义到previewController子句,该子句必须使用{{1}之类的关键字来转移控制}。
  • 如果else不是return而我们的常量已经创建,那么我们将继续检查我们的controller条款。
  • 如果nil评估为where(如果没有错误),我们将通过测试并完成where语句。 true永远不会被执行。
  • 如果guard评估为else,我们将执行where阻止,并且false语句不会被调用之后执行任何操作。 < / LI>