如何使用pjsip和callkit处理多个电话呼叫

4
我们在iOS的callKit框架方面遇到了问题。
我们需要在应用程序中实现以下功能:
- 一对一呼叫(运行正常)。 - 我们可以结束和接受第二个电话(工作正常)。 - 我们可以保持和接受呼叫(最多2个呼叫)。 - 我们可以在呼叫之间切换。 - 暂停/取消暂停当前呼叫。
问题:我们面临的问题是:
- 当保持和接受无声的第二个电话时,我们能够接受第二个电话。 - 来自通话套件的切换通话按钮处于禁用状态。
我们已经进行了以下处理来处理多个呼叫:
我们通过以下方法报告新呼叫。
- (void)reportNewIncomingCallWithUUID:(nonnull NSUUID *)UUID handle:(nonnull NSString *)handle
                       completion:(nullable void (^)(NSError *_Nullable error))completion {

CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
update.hasVideo = NO;
update.supportsDTMF = YES;
update.supportsHolding = YES;
update.supportsGrouping = YES;
update.supportsUngrouping = YES;    
[_provider reportNewIncomingCallWithUUID:UUID update:update completion:^(NSError * _Nullable error) {
    completion(error);
    if (!error) {
    }
}];     
}

第二个呼叫时,它会要求用户选择“结束和接受”或“保持和接受”

这是我们获得第二个呼叫视图的方式

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

    - (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{

现在已经禁用了切换通话按钮。

问题:

  • 如何解决音频问题?
  • 我们可以启用切换通话按钮吗?
  • 如果启用该按钮,则在切换通话时将调用哪种方法?

如果有人使用过callKit和pjsip,请帮助我解决这个问题。谢谢。

1个回答

3

接听电话时,请执行保持操作以确保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];
        }

以下是保持通话的代码。不要忘记执行[action fulfill]。
当您点击交换按钮时,CXHeldCall将被触发两次:
1. 保持一个呼叫(从操作的callUUID中查找呼叫对象并将其保持) 2. 取消保持一个呼叫(从操作的callUUID中查找呼叫对象并取消保持)
祝好运 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接