iOS Callkit:CXProvider在启动后立即重置

时间:2017-04-19 18:48:34

标签: ios objective-c callkit

我正在将现有的VoIP应用程序转换为Callkit。我有很多代码,但不知何故,当我初始化CXProvider时,它将调用providerDidBegin,然后立即调用providerDidReset。它没有给出理由。之后我无法注册其中一个外拨电话,因为我的提供商没有活动。

我尝试过查看证书,设置等等,但基本上我似乎并不需要比我的VoIP应用程序更多的东西。

CallKit调用reset方法的调用如下:

CallKit`__42- [CXProvider handleConnectionInterruption] _block_invoke:

当我深入挖掘它的来源时,它与NSXPCConnection有关。这是什么联系,我该如何设置呢?

当然连接没有中断。

这是我初始化我的代表的方式:

- (id)init {
    self = [super init];

    self.configuration = [[ProviderConfiguration alloc] init];
    self.provider = [[CXProvider alloc] initWithConfiguration:self.configuration];

    [self.provider setDelegate:self queue:dispatch_get_main_queue()];

    return self;
}

这就是配置的样子:

- (instancetype)init {
    self = [super initWithLocalizedName:@"MyCompany"];

    self.supportsVideo = NO;
    self.maximumCallsPerCallGroup = 1;
    self.supportedHandleTypes = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:(int)CXHandleTypePhoneNumber], nil];
    self.maximumCallGroups = 1;
    self.maximumCallsPerCallGroup = 5;


    return self;
}

两个回调都已实施:

- (void)providerDidBegin:(CXProvider *)provider {
    NSLog(@"Begun");
}

- (void)providerDidReset:(CXProvider *)provider {
    NSLog(@"Reset");
}

5 个答案:

答案 0 :(得分:12)

在我的情况下,同样的问题是由于缺少Info.plist文件中的VOIP后台模式

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
    <string>voip</string>
</array>

XCode 9不允许使用“功能”选项卡设置此背景模式,原因不明。

答案 1 :(得分:2)

确保您使用有效的非空UUID调用reportNewIncomingCallWithUUID:update:completion。 Apple的当前实现调用完成,没有错误,但没有显示调用屏幕

答案 2 :(得分:0)

不知何故,这些问题出现了问题:

self.configuration = [[ProviderConfiguration alloc] init];
self.provider = [[CXProvider alloc] initWithConfiguration:self.configuration];

在调用init之前,它已存储在self.configuration中。通过在内联中放置相同的代码,它可以工作。

CXProviderConfiguration *configuration = [[CXProviderConfiguration alloc] initWithLocalizedName:@"MyCompany"];

configuration.supportsVideo = NO;
configuration.supportedHandleTypes = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:(int)CXHandleTypePhoneNumber], nil];
configuration.maximumCallGroups = 1;
configuration.maximumCallsPerCallGroup = 5;
self.provider = [[CXProvider alloc] initWithConfiguration:configuration];

答案 3 :(得分:0)

我在模拟器上有相同的行为。 在设备上还可以。

答案 4 :(得分:0)

您不能使用providerDidBegin来处理呼叫,因为它用于标识类实例ProviderDelegateCXProviderDelegate实例的开头。要进行正确的管理,您必须创建可以为您执行此操作的辅助类。

请参阅以下来自WWDC 2016的示例: https://github.com/Lax/Learn-iOS-Swift-by-Examples/tree/master/Speakerbox

相关问题