CloudKit推送通知,在背景上运行的应用程序

时间:2015-04-29 17:27:26

标签: ios8 apple-push-notifications background-process cloudkit ios8.2

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

如果它在前台运行,它会接收推送通知。

知道发生了什么事吗?

CloudKit Development模式下运行,订阅用于添加,修改和删除,并使用以下didReceiveRemoteNotification

-(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);
}

2 个答案:

答案 0 :(得分:4)

当您转到应用设置功能时,是否为背景模式启用了远程通知?

见此截图: enter image description here

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

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: nil))
    application.registerForRemoteNotifications()

在您的订阅中,您是否为CKNotificationInfo发送alertBody或alertLocalizationKey?如果您这样做,那么您将从操作系统获得通知,而您无需设置本地通知。

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

答案 1 :(得分:4)

我遇到了同样的问题,并且当应用程序不在前台时,花了几个小时才能使推送通知正常工作。

最初,我没有设置alertBody因为我不希望用户在CloudKit数据发生变化时看到消息。

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

我终于尝试将alertBody设置为空字符串:

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

现在它可以工作:即使应用程序未处于活动状态,也会调用didReceiveRemoteNotification并且不会向用户显示警告消息。