didUpdatePushCredentials未被调用

我想在我的iOS应用程序中实现VoIP通知,但是didUpdatePushCredentials方法永远不会被调用,我无法获得设备令牌。

我在应用程序中实现了APNS,这两个服务可能会发生冲突吗?

这是我的AppDelegate代码

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { LOGI(@"%@", NSStringFromSelector(_cmd)); //register for voip notifications self->pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; [self->pushRegistry setDelegate:self]; [self->pushRegistry setDesiredPushTypes:[NSSet setWithObject:PKPushTypeVoIP]]; NSLog(@"VoIP push registered"); } #pragma mark - VoIP push methods - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type { NSLog(@"voip token: %@", credentials.token); } - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { NSDictionary *payloadDict = [payload.dictionaryPayload valueForKey:@"aps"]; NSString *message = (NSString *)[payloadDict valueForKey:@"alert"]; if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = [message stringByAppendingString:@" - voip"]; localNotification.applicationIconBadgeNumber = 1; localNotification.soundName = @"notes_of_the_optimistic.caf"; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; } else { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"VoIP notification" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; }); } NSLog(@"incoming voip notfication: %@", payload.dictionaryPayload); } - (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type { NSLog(@"Voip token invalidate"); } 
  • 我启用了远程通知,安装了证书和配置文件。
  • 我可以使用APNS推送标准通知。

任何让它运作的解决方案?

如果您正在运行较新的xcode(我在xcode 9上),那么VOIP不在Capabilities选项卡的Background部分中。 这样可以防止didUpdatePushCredentials

诀窍是你必须进入你的plist,在Required Background Modes你需要添加App provides Voice over IP services

我无法相信Apple已经对我们这样做了。 我浪费了8个小时的工作日来寻找这个简单的解决方案。

在此处输入图像描述

使用下面的代码并确保遵循以下内容。

 **`**// Register for VoIP notifications**`** - (void) voipRegistration { dispatch_queue_t mainQueue = dispatch_get_main_queue(); // Create a push registry object _voipRegistry = [[PKPushRegistry alloc] initWithQueue: mainQueue]; // Set the registry's delegate to self [_voipRegistry setDelegate:(id _Nullable)self]; // Set the push type to VoIP _voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; } 

didFinishLaunchingWithOptions调用Below方法

其他删除方法如下

 - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials: (PKPushCredentials *)credentials forType:(NSString *)type { // Register VoIP push token (a property of PKPushCredentials) with server if([credentials.token length] == 0) { NSLog(@"voip token NULL"); return; } NSLog(@"%@",credentials.token); } 

//在项目function中确保这一点

1)背景模式为ON

2)VOIP

3)背景提取

4)remotenotification

5)别忘了导入代表

在背景模式中

证书存在问题。

已重新生成并重新导入的证书和问题已修复。