Ios 如何使用pjsip和callkit处理多个调用

Ios 如何使用pjsip和callkit处理多个调用,ios,mobile,voip,pjsip,callkit,Ios,Mobile,Voip,Pjsip,Callkit,我们面临一个关于iOS的callKit框架的问题 我们必须在应用程序中实现以下功能。 一对一通话(工作正常) 我们可以结束并接受第二个电话(工作正常) 我们可以接听和接听电话(最多2个电话) 我们可以在电话之间切换 保持/取消挂起当前呼叫 问题:我们面临的问题是: 当按住并接受时,我们可以接受没有音频的第二个呼叫 呼叫套件中的开关呼叫按钮已禁用 我们为处理多个呼叫完成了以下实现: 我们正在通过以下方法报告新调用 在第二次呼叫时,它将要求用户(结束并接受)或(保持并接受) 当我们单击“保

我们面临一个关于iOS的callKit框架的问题

我们必须在应用程序中实现以下功能。

  • 一对一通话(工作正常)
  • 我们可以结束并接受第二个电话(工作正常)
  • 我们可以接听和接听电话(最多2个电话)
  • 我们可以在电话之间切换
  • 保持/取消挂起当前呼叫
问题:我们面临的问题是:

  • 当按住并接受时,我们可以接受没有音频的第二个呼叫

  • 呼叫套件中的开关呼叫按钮已禁用

我们为处理多个呼叫完成了以下实现:

我们正在通过以下方法报告新调用

在第二次呼叫时,它将要求用户(结束并接受)或(保持并接受)

当我们单击“保持并接受”时

这就是我们在等待和接受时接受第二次呼叫的方式。 这是工作正常,没有音频激活接受呼叫。并调用以下方法:

现在,交换通话的按钮已被禁用

查询:

  • 如何解决音频问题
  • 我们可以启用开关呼叫按钮吗
  • 如果该按钮已启用,则在切换呼叫时将调用哪个方法
伙计们,如果有人使用过callKit和pjsip,请帮我解决这个问题。
谢谢。

在接听电话时,请执行保持操作,以确保callkit保持当前通话。这将启用交换呼叫按钮

不要忘记为CXCallUpdate启用以下功能:

update.supportsHolding = YES;
update.supportsGrouping = NO;
update.supportsUngrouping = NO;



 -(void)provider:(CXProvider *)provider performSetHeldCallAction:(CXSetHeldCallAction *)action{
               if (action.onHold) {
                    [callForHold holdCurrentCall];
                }else{
                    [callForHold unHoldCurrentCall];
                }

            [action fulfill];
        }
上面是等待的代码。别忘了做[行动]

单击交换按钮时,CXHeldCall将被触发2次:

  • 一个要挂起的调用(从action的CallUID中找到call对象并挂起该调用)
  • 要取消挂起的第二个调用(从action的CallUID中查找调用对象并取消挂起该调用)
干杯;)

    - (BOOL)provider:(CXProvider *)provider executeTransaction:(CXTransaction* )transaction
{
    NSLog(@"executeTransaction : %@", transaction.debugDescription);
    BOOL callEnd = NO;
    BOOL callHold= NO;
    BOOL callAnswer = NO;


    NSPredicate *filter = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [CXEndCallAction class]];
    NSArray *ends = [transaction.actions filteredArrayUsingPredicate:filter];
    callEnd = [ends count] >= 1;

    filter = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [CXAnswerCallAction class]];
    NSArray *answer = [transaction.actions filteredArrayUsingPredicate:filter];
    callAnswer = [answer count] >= 1;

    filter = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [CXSetHeldCallAction class]];
    NSArray *hold = [transaction.actions filteredArrayUsingPredicate:filter];
    callHold = [hold count] >= 1;


    if(callHold && callAnswer){
            pjsua_set_no_snd_dev();
        Call *currentCallObject = [self getCallObjectFromUUID:callAnswer.callUUID];
        if (currentCallObject != nil) {

            pjsua_call_id callId;
            callId = currentCallObject._call_id;            
            [self startAudio];
            [currentCallObject answerCallWithCompletion:^(BOOL isSucceed) {
                if (isSucceed) {
                    CallInfo *callForHold;
                    callForHold = [self getCallToBeHoldFromUUID:callHold.callUUID];                    
                    if (callForHold != nil) {
                        [callForHold holdCurrentCall];
                    }
                }
            }];
        }


        return YES;

    }else{
        return NO;
    }
}
- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession{
update.supportsHolding = YES;
update.supportsGrouping = NO;
update.supportsUngrouping = NO;



 -(void)provider:(CXProvider *)provider performSetHeldCallAction:(CXSetHeldCallAction *)action{
               if (action.onHold) {
                    [callForHold holdCurrentCall];
                }else{
                    [callForHold unHoldCurrentCall];
                }

            [action fulfill];
        }