同时使用2个SDK(CALL KIT和VoIP SDK)管理来电?

时间:2019-07-31 08:55:32

标签: ios

#import "AppDelegate.h"
#import <Intents/Intents.h>
#import <CallKit/CallKit.h>
#import <PushKit/PushKit.h>

#pragma mark - PKPushRegistryDelegate

- (void)pushRegistry:(nonnull PKPushRegistry *)registry didUpdatePushCredentials:(nonnull PKPushCredentials *)pushCredentials forType:(nonnull PKPushType)type {
   if ([pushCredentials.token length] == 0) {
      NSLog(@"VoIP token NULL..");
   }
}

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type
{
   NSString *uuidString = payload.dictionaryPayload[@"UUID"];
   NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
   NSString *phoneNumber = payload.dictionaryPayload[@"PhoneNumber"];
   CallViewController *viewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"CallViewController"];
   viewController.number = phoneNumber;
   viewController.incoming = YES;
   viewController.callId = uuid;
   UIViewController *mainViewController = self.window.rootViewController;
   [mainViewController presentViewController:viewController animated:YES completion:nil];
}

#import "CallManager.h"
#import <CallKit/CallKit.h>
#import <CallKit/CXError.h>
@interface CallManager () <CXProviderDelegate>

@property (nonatomic, strong) CXProvider *provider;
@property (nonatomic, strong) CXCallController *callController;

@property (nonatomic, strong) NSUUID *currentCall;

@end

@implementation CallManager

+ (CallManager*)shaaredInstance {
    static CallManager *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[CallManager alloc] init];
        [sharedInstance provider];
    });
    return sharedInstance;
}

- (void)reportIncomingCallForUUID:(NSUUID*)uuid phoneNumber:(NSString*)phoneNumber {
    CXCallUpdate *update = [[CXCallUpdate alloc] init];
    update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:phoneNumber];
    __weak CallManager *weakSelf = self;
    [self.provider reportNewIncomingCallWithUUID:uuid update:update completion:^(NSError * _Nullable error) {
        if (!error) {
            weakSelf.currentCall = uuid;
        } else {
            if (self.delegate && [self.delegate respondsToSelector:@selector(callDidFail)]) {
                [self.delegate callDidFail];
            }
        }
    }];
}

- (void)startCallWithPhoneNumber:(NSString*)phoneNumber {
    CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:phoneNumber];
    self.currentCall = [NSUUID new];
    CXStartCallAction *startCallAction = [[CXStartCallAction alloc] initWithCallUUID:self.currentCall handle:handle];
    CXTransaction *transaction = [[CXTransaction alloc] init];
    [transaction addAction:startCallAction];
    [self requestTransaction:transaction];
}

- (void)endCall {
    CXEndCallAction *endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.currentCall];
    CXTransaction *transaction = [[CXTransaction alloc] init];
    [transaction addAction:endCallAction];
    [self requestTransaction:transaction];
}

- (void)holdCall:(BOOL)hold {
    CXSetHeldCallAction *holdCallAction = [[CXSetHeldCallAction alloc] initWithCallUUID:self.currentCall onHold:hold];
    CXTransaction *transaction = [[CXTransaction alloc] init];
    [transaction addAction:holdCallAction];
    [self requestTransaction:transaction];
}

- (void)requestTransaction:(CXTransaction*)transaction {
    [self.callController requestTransaction:transaction completion:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error.localizedDescription);
            if (self.delegate && [self.delegate respondsToSelector:@selector(callDidFail)]) {
                [self.delegate callDidFail];
            }
        }
    }];
}

#pragma mark - Getters

- (CXProvider*)provider {
    if (!_provider) {
        CXProviderConfiguration *configuration = [[CXProviderConfiguration alloc] initWithLocalizedName:@"IP-PBX"];
        configuration.supportsVideo = YES;
        configuration.maximumCallsPerCallGroup = 1;
        configuration.supportedHandleTypes = [NSSet setWithObject:@(CXHandleTypePhoneNumber)];
        _provider = [[CXProvider alloc] initWithConfiguration:configuration];
        [_provider setDelegate:self queue:nil];
    }
    return _provider;
}

- (CXCallController*)callController {
    if (!_callController) {
        _callController = [[CXCallController alloc] init];
    }
    return _callController;
}

#pragma mark - CXProviderDelegate

- (void)providerDidReset:(CXProvider *)provider {
}

// Called when the provider has been fully created and is ready to send actions and receive updates
- (void)providerDidBegin:(CXProvider *)provider {
}

// If provider:executeTransaction:error: returned NO, each perform*CallAction method is called sequentially for each action in the transaction
- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action {
    //todo: configure audio session
    //todo: start network call
    [self.provider reportOutgoingCallWithUUID:action.callUUID startedConnectingAtDate:nil];
    [self.provider reportOutgoingCallWithUUID:action.callUUID connectedAtDate:nil];

    if (self.delegate && [self.delegate respondsToSelector:@selector(callDidAnswer)]) {
        [self.delegate callDidAnswer];
    }
    [action fulfill];
}

- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
    //todo: configure audio session
    //todo: answer network call
    if (self.delegate && [self.delegate respondsToSelector:@selector(callDidAnswer)]) {
       [self.delegate callDidAnswer];
    }
    [action fulfill];
}

- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action {
    //todo: stop audio
    //todo: end network call
    self.currentCall = nil;
    if (self.delegate && [self.delegate respondsToSelector:@selector(callDidEnd)]) {
        [self.delegate callDidEnd];
    }
   [action fulfill];
}

- (void)provider:(CXProvider *)provider performSetHeldCallAction:(CXSetHeldCallAction *)action {
    if (action.isOnHold) {
        //todo: stop audio

    } else {
        //todo: start audio
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(callDidHold:)]) {
        [self.delegate callDidHold:action.isOnHold];
    }
    [action fulfill];
}

我正在VOIP应用程序中使用呼叫工具包(也使用ABTO VoIP SDK)。但是我想将我的VoiP App通话记录合并到“ iPHONE最近使用的标签”中。我在项目中添加了“呼叫工具包”,一切都很好,我在“ iPhone最近使用的选项卡”中获取了VoIP应用程序的呼叫历史记录。但是,一旦我打入或打出电话,我在打电话时会遇到问题,我将收到Callkit默认屏幕,该屏幕将打入电话转入保持和拨出状态。有什么方法可以管理Callkit默认屏幕吗?可以同时管理两个SDK吗???我也在使用Pushkit。 请帮助我解决此问题????

每当接到来电时,我都会面对两个来自Voip SDK的呼叫屏幕,一个面对来自呼叫工具包的呼叫。我要管理该默认屏幕

0 个答案:

没有答案