3

我制作了 VOIP App。为此,我将 PushKit 和 Callkit 与 pjsip 一起使用。

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

1)调用结束问题

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

错误域=com.apple.callkit.error.request 事务代码=4

为此,我检查了答案和结束通话 uuid 也相同,但又不是结束通话。我花了很多时间但没有得到任何解决方案。

任何人都有解决方案然后请帮助我。

2) 接听电话后的音频问题

接受呼叫音频后未配置。音频会话给我以下错误:

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

对于上述错误,任何人都有解决方案然后给我。

谢谢你。

4

3 回答 3

3

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

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

于 2017-10-29T12:38:54.557 回答
3

1)调用结束问题

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

CXErrorCodeRequestTransactionErrorUnknownCallUUID = 4

要在 CallKit 框架中正确结束通话,您必须CXEndCallAction使用您的独特UUID和请求事务从CXCallController.

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

在提供者方法中,您应该通过 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) 接听电话后的音频问题

当您接受呼叫时,将触发以下方法- (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();
}
于 2017-09-07T08:36:53.510 回答
2

只维护 Provider、Configuration 和 CXCallController 的一个实例解决了 end call 问题。

于 2020-03-03T11:05:15.363 回答