【问题标题】:Callkit call End issue(error domain=com.apple.callkit.error.requesttransaction code=4) and Audio issue after Call acceptCallkit 通话结束问题(错误域=com.apple.callkit.error.requesttransaction code=4)和通话接受后的音频问题
【发布时间】:2017-09-07 07:10:14
【问题描述】:

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

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

1) 通话结束问题

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

错误域=com.apple.callkit.error.requesttransaction code=4

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

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

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

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

音频会话错误:Error Domain=NSOSStatusErrorDomain Code=561017449 "(null)" [aurioc] 892: failed: '!pri' (启用 3, outf inf)

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

谢谢。

【问题讨论】:

    标签: ios callkit pushkit


    【解决方案1】:

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

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

    【讨论】:

    • @Muhammad Adly 为什么让它成为单身人士可以解决问题?即问题是什么,单例如何解决该问题?谢谢
    【解决方案2】:

    1) 调用结束问题

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

    CXErrorCodeRequestTransactionErrorUnknownCallUUID = 4
    

    要在 CallKit 框架中正确结束通话,您必须使用您唯一的 UUID 初始化 CXEndCallAction,并通过您的 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();
    }
    

    【讨论】:

    • 您好 McLaLa,我将应答呼叫的 UUID 存储在应用程序委托全局变量中,并且在呼叫结束时使用此 UUID,但它再次给我同样的错误。请求交易时出错:操作无法完成。 (com.apple.CallKit.error.requesttransaction 错误 4。)我参考以下 callkit:raywenderlich.com/150015/callkit-tutorial-ios
    • 当我调用结束时,得到以下 UUID 和事务:-调用 uuid 是--->9DD75246-78AF-4560-BA9D-288934E159D0 调用事务是--->" )> 在上面相同的 callUUID 但它给了我同样的错误。
    • 据我所知,你写的很快。能否请您发布结束通话的代码?
    • 结束调用代码:- let endCallAction = CXEndCallAction.init(call: call.uuid) let transaction = CXTransaction(action: endCallAction) CXCallController.request(transaction) { error in if let error = error { print("请求交易时出错:(error.localizedDescription)") } else { print("请求交易成功") } }
    • @ShraddhaVaishnani 我也遇到了同样的错误,你找到解决办法了吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多