CallKit 重新初始化导致 com.apple.CallKit.error.requesttransaction Code=4 (UnknownCallUUID)

CallKit reinitializing causes com.apple.CallKit.error.requesttransaction Code=4 (UnknownCallUUID)

我的 iOS VoIP 应用程序使用 CallKit 来支持本机呼叫集成功能。一开始启动一切正常,但如果我重新初始化 CXProvider 和 CXCallController(为了 disable/enable 功能),来电挂断后我收到错误 "com.apple.CallKit.error.requesttransaction Code=4".

@implementation CallKitHandler
- (void) configureCallKitWith
{
    ...
    self.callKitProvider = [[CXProvider alloc]  initWithConfiguration:_cxpConfiguration];
    [_callKitProvider setDelegate:self queue:nil];

    self.callKitCallController = [CXCallController new];
    [_callKitCallController.callObserver setDelegate:self      queue:nil];
    ...
}
- (void) requestEndCallActionWithCall:(Call*) callEnded
{
    CXEndCallAction* endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.callUUId];
    CXTransaction* transaction = [[CXTransaction alloc] initWithAction:endCallAction];
    OTCLogVerbose (@"requestEndCallActionWithCall '%@' : %@", callEnded.reference, transaction);

    [self.callKitCallController requestTransaction:transaction completion:^(NSError* error) {
        if (error)
        {
            OTCLogWarn (@"requestEndCallActionWithCall failed for '%@': %@", _callUUId, [self errorDescriptionOf: error]);

我试图让我的 CallKitHandler class 成为单例,它似乎工作正常,这是唯一可能的解决方案吗?您应该避免在应用运行时重新初始化 CallKit 吗?

documentation 说:

A VoIP app should create only one instance of CXProvider and store it for use globally.

所以,是的:您应该避免每次要重新配置时都实例化 CXProvider。只保留一个全局引用并在需要时重新配置它。