Как мы можем обрабатывать несколько вызовов с помощью pjsip и callkit - PullRequest
0 голосов
/ 25 апреля 2018

Мы столкнулись с проблемой, касающейся callKit Framework для iOS.

Мы должны реализовать следующие функции в приложении.

  • Один-на-один (работает нормально) .
  • мы можем завершить и принять второй вызов (работает нормально) .
  • мы можем удерживать и принимать звонки (максимум 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 Ответ

0 голосов
/ 26 апреля 2018

Принимая вызов, выполните удерживаемое действие, чтобы убедиться, что callkit удерживает текущий вызов.Это активирует кнопку вызова Swap.

Не забудьте включить следующие элементы для 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 раза:

  • Один вызов удерживается (найдитевызовите объект из callUUID действия и удерживайте этот вызов)
  • Второй вызов для отмены вызова (найдите объект вызова из callUUID действия и отмените этот вызов)

Cheers;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...