Callkit call End issue(error domain=com.apple.callkit.error.requesttransaction code=4) 和 Audio issue after Call accept

Callkit call End issue(error domain=com.apple.callkit.error.requesttransaction code=4) and Audio issue after Call accept

我制作了 VOIP App.For 我正在使用带有 pjsip 的 PushKit 和 Callkit。

当应用程序在后台收到呼叫通知并基于此我打开 callkit 屏幕并单击接受呼叫后使用 pjsip 连接。

1) 调用结束问题

但是当调用 hangout pjsip 成功调用 hangout 但随后 callkit 给我以下错误:

错误域=com.apple.callkit.error.requesttransaction代码=4

为此,我检查了答案并结束呼叫 uuid 也相同,但同样没有结束 call.I 花了很多时间但没有得到任何解决方案。

谁有解决办法请帮帮我

2) 接听电话后出现音频问题

接受呼叫音频后 configure.Audio 会话给我以下错误:

音频会话错误:错误域=NSOSStatusErrorDomain 代码=561017449“(null)” [auurioc] 892:失败:'!pri'(启用 3,outf< 1 ch,44100 Hz,Int16> inf< 1 ch,44100 Hz,Int16>)

以上错误谁有解决办法再给我。

谢谢。

1) call End issue

com.apple.callkit.error.requesttransaction code=4 表示 UUID 未知。

CXErrorCodeRequestTransactionErrorUnknownCallUUID = 4

要在 CallKit 框架中正确结束通话,您必须使用您的唯一 UUID 初始化 CXEndCallAction 并从您的 CXCallController.[=23= 请求使用 "end call action" 进行交易]

CXEndCallAction *action = [[CXEndCallAction alloc] initWithCallUUID:c_UUID]; 
[self.callController requestTransaction:[CXTransaction transactionWithActions:@[action]] completion:completion];

在 provider 方法中你应该通过 pjsip 结束你的调用并且不要忘记调用 [action fulfill].

- (void)provider:(CXProvider *)provider performEndCallAction:(nonnull CXEndCallAction *)action {
   // get your current pjsip call object
   ...
   // make hangup - something like:
   pj_status_t status = pjsua_call_hangup([self identifier], 0, NULL, NULL);
   if (status != PJ_SUCCESS) {
       NSString *errStr = [NSString stringWithFormat:@"Error hanging up call %@", self];
       ALog(@"%@", errStr);
   }
   [action fulfill];
}

2) Audio issue After Accept call

当您接受调用时,将触发以下方法 - (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession,当您结束调用时,将调用此方法 (void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession

- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession{
    // start audio and configure pjsip sound
    pj_status_t status = pjsua_set_snd_dev(input, output); // '0' for input and output
}

并在以下方法中停用 pjsip 调用的声音。

- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession{
    // end audio
    pj_status_t status = pjsua_set_null_snd_dev();
}

我通过将包含 CallKit 函数的 class 作为单例来修复它,并且从不分配它的新实例。 你可以看看这个帮手 class:

https://github.com/naandonov-mm/iOS-10-Sampler/tree/master/CallKit

仅维护 Provider、Configuration 和 CXCallController 的一个实例解决了结束调用问题。