Callkit调用结束问题(错误域= com.apple.callkit.error.requesttransaction代码= 4)和调用接受后的音频问题

时间:2017-09-07 07:10:15

标签: ios callkit pushkit

我制作了VOIP App。因为我正在使用PushKit和Callkit和pjsip。

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

1)致电最终问题

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

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

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

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

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

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

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

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

谢谢。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

仅维护Provider,Configuration和CXCallController的一个实例即可解决结束呼叫问题。

答案 2 :(得分:1)

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

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