簡體   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