2017-04-19 113 views
3

我正在將現有的VoIP應用程序轉換爲Callkit。我有很多代碼,但不知何故,當我初始化CXProvider時,它會調用providerDidBegin,然後立即調用providerDidReset。它沒有給出原因。之後,我無法註冊其中一個撥出的電話,因爲我的提供商未處於活動狀態。iOS Callkit:CXProvider啓動後立即重置

我試過尋找證書,設置等,但基本上我不需要比我已經有我的VoIP應用程序似乎更多。

從CallKit調用重置方法的調用如下:

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"); 
} 

回答

7

在我的情況下,同樣的問題是由於Info.plist文件丟失VOIP背景模式

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

的XCode 9不允許使用功能選項卡對於一些未知的設置此背景模式原因。

+0

非常感謝你 –

+0

由於大多數人似乎是由你的答案幫助我將它設置爲接受回答 –

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]; 
+1

爲了可能會遇到的其他人的利益:問題是,儘管'CXProviderConfiguration'是可變的,'CXProvider'實際上不會讀取任何更改在初始化之後(或者看起來)。當我們想要動態改變鈴聲時,我們遇到了這個問題;該解決方案是即時創建一個_new_配置和提供程序(工作正常)。不幸的是,大多數的CallKit文檔仍然只是存根,並沒有指出這些黑暗的角落(也沒有其他的東西!) –

1

確保您使用有效的非空UUID呼叫reportNewIncomingCallWithUUID:update:completion。蘋果公司目前的實現呼籲完成沒有錯誤,但沒有顯示呼叫屏幕

+0

我內部下注的東西在對象的生命週期中被重置爲零,因爲內聯代碼在這種情況下有所幫助。 –

相關問題