CallKit CXCallController.request error com.apple.CallKit.error.requesttransaction Code=6 while app is in the background

CallKit CXCallController.request error com.apple.CallKit.error.requesttransaction Code=6 while app is in the background

此错误仅出现在 iOS 13.3.1 中。它不会出现在 iOS 13.3.0 或更早版本上。

如果应用程序在前台并调用 CXCallController.request,则它工作正常。但是一旦我将应用程序置于后台并执行 'CXCallController.request'(由耳机播放按钮触发),我就会收到以下错误:

Error requesting transaction: Error Domain=com.apple.CallKit.error.requesttransaction Code=6 "(null)"

代码 6 是 CXErrorCodeRequestTransactionError.Code.invalidAction

这是示例代码的片段

let uuid = UUID()
let handle = CXHandle(type: .emailAddress, value: "jappleseed@apple.com")

let startCallAction = CXStartCallAction(call: uuid, handle: handle)

let transaction = CXTransaction(action: startCallAction)
callController.request(transaction) { error in
    if let error = error {
        print("Error requesting transaction: \(error)")
    } else {
        print("Requested transaction successfully")
    }
}

相同的代码在 iOS 13.3.0 及更早版本中工作正常,无论应用程序是前台还是后台。也许这是 13.3.1 的错误,或者 Apple 在应用程序处于后台时实施了一些安全措施?但我在 iOS 13.3.1 发行说明中没有看到它。

我找到了解决我自己问题的方法。它可能只适用于我的特定条件。它可能无法解决所有错误代码=6 的问题。只是想让你知道。

解决此问题的方法是,当您的应用程序处于后台时,您必须在调用 CXCallController.request(:) 之前播放音频。如果需要,您甚至可以播放一秒钟的静音。它不一定是可听见的声音。

如果不行,你可以尝试使用延迟0.1秒的dispatch async来调用CXCallController.request(:)。这个想法是,当您调用 CXCallController.request(:).

时,您需要确保音频引擎处于活动状态