2016-12-02 2 views
1

앱이 한 번에 두 개의 통화를 지원한다고 가정 해 보겠습니다. 첫 번째 통화가 연결되고 두 번째 통화가 들어옵니다. "최종 통화 & 응답 통화", "거부", "통화 및 응답 통화 보류"버튼이 표시됩니다.CallKit : 거부 통화와 연결된 통화를 구분하는 방법

"최종 통화 & 응답 전화"의 경우 연결된 통화를 종료하고 새 통화에 응답하는 것을 의미합니다. "거절"의 경우, 통화를 거부하는 것을 의미합니다. 두 경우 모두

대리인

- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action 

트리거됩니다. 이제 어떻게 종료 할 통화 중 하나, 들어오는 통화 또는 이미 연결된 통화를 알아야합니까? CXEndCallAction에는 "거부"또는 "이미 종료 된 통화 종료"이유가 나와 있지 않습니다.

누구나 해결 방법이 있습니까?

+0

대리인이 최종 위임자가 될 경우 매우 다양한 대리자 메서드가 있습니다. 결정을 내리기 위해 다른 대의원이 촉발되었음을 기록하십시오. –

답변

1

나는 트랜잭션 목록 대리인이 있음을 발견했다. 그래서 지금 나는 어떤 행동을 촉발 시킬지 결정할 수 있으며 필요한 경우 다른 대표들을 우회 할 수 있습니다. 다른 사람이 어려움을 겪고있는 경우

여기 내 코드입니다 :

- (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(callEnd && callAnswer) 
{ 
    actionType = kCallKitEndAndAnswer; 
    [[MyCallManager sharedManager] endPreviousCallAndAnswerNewCall:^(BOOL succeeded) { 
     NSLog(@"end answered call: %@", succeeded ? @"yes" : @"No"); 
     CXEndCallAction *en = [ends firstObject]; 
     succeeded ? [en fulfill] : [en fail]; 

     CXAnswerCallAction *an= [answer firstObject]; 
     succeeded ? [an fulfill] : [an fail]; 

    }]; 
    return YES; 
} 
else if(callHold && callAnswer) 
{ 
    actionType = kCallKitHoldAndAnswer; 

    [[MyCallManager sharedManager] answerCall:^(BOOL succeeded) { 
     NSLog(@"hold answered call: %@", succeeded ? @"yes" : @"No"); 
     CXSetHeldCallAction *ho = [hold firstObject]; 
     succeeded ? [ho fulfill] : [ho fail]; 

     CXAnswerCallAction *an= [answer firstObject]; 
     succeeded ? [an fulfill] : [an fail]; 
    }]; 
    return YES; 
} 
else if([hold count] == 2) 
{ 
    [[MyCallManager sharedManager] swapCalls]; 
    usleep(25000); 
    CXSetHeldCallAction * fi = [hold firstObject]; 
    CXSetHeldCallAction * la = [hold lastObject]; 
    [fi fulfill]; 
    [la fulfill]; 

    return YES; 
} 

return NO; 
} 
0

CXEndCallAction의 callUUID 멤버에 액세스해야합니다.

트랜잭션이 올바른 개체에서 호출되므로 전송 된 UUID와 일치하는 호출을 종료하면됩니다. 이는 UUID에 대한 지원을 자신의 호출 객체 모델에 추가해야 함을 의미합니다.

- (BOOL)provider:(CXProvider *)provider executeTransaction:(CXTransaction *)transaction 

다른 대표 CXSetHeldCallAction 또는 CXEndCallAction 등을 게재 할 트랜잭션이있을 경우 충분한 정보를 제공합니다이 대리자를 구현 :

0

당신은 열거하고 "isMemberOfClass"를 사용할 수 있습니다.

providerDelegate.m

@property(nonatomic, assign) CallMode mode; 

에서 providerDelegate.h

// Call Modes. 
typedef NS_ENUM(NSUInteger, CallMode) { 
    kUnknownMode = 0, 
    kEndAndAnswerMode = 1, 
    kHoldAndAnswerMode = 2 
}; 

에서

그리고 모든 트랜잭션을 얻기 위해 코드 아래에 추가합니다.

- (BOOL)provider:(CXProvider *)provider executeTransaction:(CXTransaction *)transaction { 

    NSLog(@"Provider execute transaction"); 

    BOOL callEnd = NO; 
    BOOL callHold= NO; 
    BOOL callAnswer = NO; 

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

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

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

    if(callEnd && callAnswer) { 
     _mode = kEndAndAnswerMode; 
    } else if(callHold && callAnswer) { 
     _mode = kHoldAndAnswerMode; 
    } else { 
     _mode = kUnknownMode; 
    } 

    return NO; 
}