Мы столкнулись с проблемой, касающейся 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, пожалуйста, помогите мне с этим.
Спасибо.