2017-04-19 1 views
3

기존 VoIP 애플리케이션을 Callkit으로 변환 중입니다. 많은 코드가 있지만 어쨌든 CXProvider를 초기화하면 providerDidBegin이 호출되고 바로 그 후에 providerDidReset이 호출됩니다. 그것은 그 이유를 밝히지 않습니다. 내 공급자가 활성화되어 있지 않아 이후에 내 전화 통화 중 하나를 등록 할 수 없습니다.iOS Callkit : CXProvider가 시작 직후에 재설정됩니다.

나는 인증서, 설정 등을 조사해 보았지만 근본적으로 나는 내 VoIP 앱에 대해 이미 가지고있는 것 이상을 필요로하지 않는다.

CallKit`__42- [CXProvider handleConnectionInterruption] _block_invoke :

이 어디에서 오는지 나는 깊이 파고

이,이 NSXPCConnection 관련이

reset 메소드를 호출 CallKit에서 호출

은 다음과 같다. 이 연결은 무엇이며 어떻게 설정해야합니까?

물론 연결에 중단이 없습니다. 두 콜백 구현

- (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> 

엑스 코드 (9)는 알 수없는 위해 기능 탭을 사용하여이 배경 모드를 설정하는 것을 허용하지 않습니다 이유.

+0

고맙습니다. –

+0

대부분의 사람들이 당신의 대답에 도움이되는 것 같아서 받아 들였습니다. Answer –

0

이 줄이었다

- (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; 
} 

이 같은 구성이 모습입니다 :

이것은 내 위임을 초기화하는 방법입니다 문제 :

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

초기화를 호출하기 전에 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'는 실제로 변경 사항을 _read_하지 않습니다. 초기화 후 (또는 그렇게 보인다). 우리는 링 톤을 동적으로 바꾸고 싶을 때 이것을 만났다. 해결책은 즉시 작동하는 _new_ 구성 및 공급자를 만드는 것이 었습니다. 불행하게도, CallKit 문서의 대부분은 여전히 ​​스텁이며이 어두운 모서리를 가리 키지 않습니다. (그 외에도 많이 있습니다!) –

1

reportNewIncomingCallWithUUID:update:completion을 유효한 Null이 아닌 유효한 UUID로 호출해야합니다. Apple의 현재 구현에서는 오류없이 완료를 호출하지만 호출 화면이 표시되지 않습니다.

+0

나는이 경우에 도움이 된 코드를 인라이닝 할 때 내부적으로 객체의 수명 동안 무언가를 nil로 재설정했다. –