首页 > 解决方案 > 当应用程序处于终止状态时,iOS VoIP 呼叫不起作用

问题描述

我能够收到新的来电推送通知并报告来电,但是当应用程序处于终止状态时,我没有收到通知并且我只收到未接来电。

在我用来处理新呼叫推送通知的代码下方:

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {

    NSString * nameA = [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]
    CXProviderConfiguration *config = [[CXProviderConfiguration alloc]initWithLocalizedName:nameA];
    config.supportsVideo = FALSE;
    config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"callkit_logo"]);

    NSArray *ar = @[ [NSNumber numberWithInt:(int)CXHandleTypeGeneric] ];
    NSSet *handleTypes = [[NSSet alloc] initWithArray:ar];
    [config setSupportedHandleTypes:handleTypes];
    [config setMaximumCallGroups:2];
    [config setMaximumCallsPerCallGroup:1];

    self.cxProvider = [[CXProvider alloc] initWithConfiguration:config];

    NSDictionary *dict = [payload.dictionaryPayload objectForKey:@"aps"];
    NSString * callm = [dict objectForKey:@"callfrom"];
    if (callm.length == 0) {
        callm = @"CALL BB";
    }
    CXHandle *callHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:callm];
    CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
    callUpdate.remoteHandle = callHandle;
    callUpdate.supportsDTMF = YES;
    callUpdate.supportsHolding = YES;
    callUpdate.supportsGrouping = NO;
    callUpdate.supportsUngrouping = NO;
    callUpdate.hasVideo = NO;

    self.uuid = [NSUUID UUID];

    [self.cxProvider reportNewIncomingCallWithUUID:self.uuid update:callUpdate completion:^(NSError *error) {
        NSLog(@"error1 ----> %@",error);
        if (error) {
            if (@available(iOS 13.0, *)) {
                [self.cxProvider reportCallWithUUID:self.uuid endedAtDate:[NSDate now] reason:CXCallEndedReasonFailed];
            } else {
            }
        }
    }];
    CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()]; 
    dispatch_async(dispatch_get_main_queue(), ^{

        CXEndCallAction *endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.uuid];
        CXTransaction *transaction = [[CXTransaction alloc] initWithAction:endCallAction];

        [callController requestTransaction:transaction completion:^(NSError *error) {
            NSLog(@"error2 ----> %@",error);
            if (@available(iOS 13.0, *)) {
                [self.cxProvider reportCallWithUUID:self.uuid endedAtDate:[NSDate now] reason:CXCallEndedReasonRemoteEnded];
            } else {
            }
        }];
    });

    [self processPush:payload.dictionaryPayload];
    dispatch_async(dispatch_get_main_queue(), ^{completion();});
}

标签: xcodevoipios13callkitpushkit

解决方案


问题可能出在代码的最后一行。您在 a 中调用完成块dispatch_async,因此它将在下一个运行循环中执行。问题是当应用程序处于终止状态时,您可能没有下一个运行循环。

尝试在以下的完成块内调用完成块reportNewIncomingCallWithUUID

[self.cxProvider reportNewIncomingCallWithUUID:self.uuid update:callUpdate completion:^(NSError *error) {
        NSLog(@"error1 ----> %@",error);
        if (error) {
            if (@available(iOS 13.0, *)) {
                [self.cxProvider reportCallWithUUID:self.uuid endedAtDate:[NSDate now] reason:CXCallEndedReasonFailed];
            } else {
            }
        }
        completion(); // <-----
}];

推荐阅读