繁体   English   中英

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

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

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

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

1)呼叫结束问题

但是当呼叫环聊 pjsip 成功呼叫环聊但随后 callkit 给我以下错误:

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

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

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

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

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

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

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

谢谢你。

1)呼叫结束问题

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

CXErrorCodeRequestTransactionErrorUnknownCallUUID = 4

要在 CallKit 框架中正确结束呼叫,您必须使用您唯一的UUID初始化CXEndCallAction并从您的CXCallController请求具有“结束呼叫操作”的CXCallController

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) 接听电话后的音频问题

当您接受呼叫时,将触发以下方法- (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 函数的类作为单例来修复它,并且从不分配它的新实例。 你可以看看这个辅助类:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM