Ios8 CloudKit推送通知,应用程序在后台运行

Ios8 CloudKit推送通知,应用程序在后台运行,ios8,apple-push-notifications,background-process,cloudkit,ios8.2,Ios8,Apple Push Notifications,Background Process,Cloudkit,Ios8.2,当iOS8.2-app在后台运行时,它不会收到任何推送通知 如果它在前台运行,则会收到推送通知 知道发生了什么吗 在CloudKit Development模式下运行,订阅用于添加、编辑和删除,并使用以下DidReceiveMemoteNotification: -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionH

当iOS8.2-app在后台运行时,它不会收到任何推送通知

如果它在前台运行,则会收到推送通知

知道发生了什么吗

CloudKit Development
模式下运行,订阅用于添加、编辑和删除,并使用以下
DidReceiveMemoteNotification

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Push received.");

    NSDictionary * apsDict = [userInfo objectForKey:@"aps"];

    NSString * alertText = [apsDict objectForKey:@"alert"];

    //TODO: get the record information from the notification and create the appropriate message string.

    if(application.applicationState == UIApplicationStateActive) {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Notification" message:alertText delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
    } else {

        if([application currentUserNotificationSettings].types & UIUserNotificationTypeAlert) {
            UILocalNotification * localNotification = [[UILocalNotification alloc] init];
            localNotification.alertBody = NSLocalizedString(@"alert body", nil);;
            localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:2];
            [application presentLocalNotificationNow:localNotification];
        }
    }

    completionHandler(UIBackgroundFetchResultNoData);
}

当您转到应用程序设置功能时,是否为后台模式启用了远程通知

请参见此屏幕截图:

除此之外,您是否注册了所有通知类型,如:

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: nil))
    application.registerForRemoteNotifications()
在订阅中,您是否为CKNotificationInfo发送alertBody或alertLocalizationKey?如果您这样做,那么您将已经收到来自操作系统的通知,而不需要设置本地通知


更新:正如Porton在下面提到的,这个问题通过填写alertBody解决了。

我也遇到了同样的问题,并且在应用程序不在前台时花了几个小时让推送通知生效

最初,我没有设置
alertBody
,因为我不希望用户在CloudKit数据更改时看到消息

但是,如上所述,如果没有
alertBody
,则当应用程序不在前台时,不会调用方法
DidReceiveMemotentification

我最后尝试将
alertBody
设置为空字符串:

CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.alertBody = @"";

现在它可以工作了:
didReceiveMemotentification
即使在应用程序未激活且未向用户显示警报消息时也会被调用。

Hi@Edwin yes后台提取和远程通知处于启用状态。任何其他明显可能遗漏的内容?在订阅中,您是否为CKNotificationInfo发送alertBody或alertLocalizationKey?这样,您就可以从操作系统获得通知,而无需设置本地通知。但是通知还是应该已经到了。特别是当你说他们在应用程序激活时到达。你是否注册了所有类型?请参阅awnseralertBody中的其他注释,该注释为空字符串!!!一旦alertBody设置为非空字符串,就会发送远程通知(根据userNotificationSettings作为横幅)。非常感谢@Edwin。我将您的答案标记为解决方案,请您更新您的答案以包括alertBody?我已将其添加到答案中