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