ReplayKit:永远不会输入startRecording()完成处理程序

Flu*_*upp 4 ios replaykit swift4 ios11 xcode9

问题描述

即使显示了“允许在$ AppName中进行屏幕录像”弹出窗口,也永远不会输入startRecording()完成处理程序。有时会显示“允许$ AppName中的屏幕录像”弹出窗口。当我删除应用程序,重新启动设备并在项目上进行清理/构建时,也会发生这种情况。我正在使用具有iOS 11和Xcode 9的iPad Air 2。

研究

这个问题在早期版本中似乎也是一个问题,请参见此处:replaykit startrecording有时永远不会进入完成处理程序 我不赞成关闭WiFi或拥有稳定的互联网连接可以解决此问题,在iOS中也无法解决此问题11。

这是我正在使用的代码:

@IBAction func recordButtonTapped(_ sender: UIButton) {
    if !recorder.isRecording {
        startRecording(sender)
    } else {
        stopRecording(sender)
    }
}

private func startRecording(_ sender: UIButton) {
    guard recorder.isAvailable else {
        print("Recording is not available at this time.")
        // Display UI for recording being unavailable
        return
    }

    recorder.startRecording(handler: { (error) in
        guard error == nil else {
            print("There was an error starting the recording.")
            print(error!)
            return
        }

        print("Started Recording Successfully")
        DispatchQueue.main.async {
            sender.setTitle("Stop Recording", for: .normal)
            sender.setTitleColor(.red, for: .normal)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

Flu*_*upp 5

我想我自己找到了答案。请尝试一下并确认是否可行:

  1. 删除您的应用
  2. 清理Xcode项目
  3. 按住iOS设备的电源按钮
  4. 出现要关闭的幻灯片时,按住主屏幕按钮,直到屏幕闪烁黑色,然后释放所有按钮
  5. 再次运行您的Xcode项目
  6. 现在应该再次调用处理程序

我怀疑记录器的共享实例中存在一些错误,只有在清理设备RAM时才能重置该错误。

编辑: 我还观察到,仅在录制过程中停止使用Xcode运行的应用程序时,才会发生此错误。如果我将应用程序置于后台或使用iOS任务管理器关闭该应用程序,则在再次启动该应用程序时不会出现此错误。

结论: 录制运行时,请勿使用Xcode关闭您的应用程序。如果您改用iOS任务管理器,则它将继续正常工作并提供回调。

编辑2: 提交了错误报告,Apple回答说他们知道此问题,并致力于解决该问题。