xcode - 当应用程序处于终止状态时,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();});
}
解决方案
问题可能出在代码的最后一行。您在 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(); // <-----
}];
推荐阅读
- scala - 在 Scala/Spark 中获取键/值对的键
- python - pyodbc 中的用户密码与 pyinstaller 无关?
- python - 如何根据熊猫中的特定列值识别数据框中的“子”数据框
- sql - 没有连接条件的 T-SQL 匹配记录 1 到 1
- azure-devops - Azure pilines - 构建 Xamarin.iOS - 未安装 iOS SDK 版本“14.0”,也未找到更新版本
- python - 如何在 Python 中使用正则表达式从文件底部读取 HTML 标记?
- node.js - 如何让这条受保护的路线正常工作?
- html - 为什么在设置背景图像时 background-image 属性需要明确指定 url()
- react-native - Xcode 12 问题:“找不到构建输入文件”- 在反应原生应用程序上构建以发布
- c# - 我需要更改此存在检查以在 User::FileName 上使用通配符