4

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

2 回答 2

4

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

看这个截图: 在此处输入图像描述

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

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

在您的订阅中,您是否为 CKNotificationInfo 发送 alertBody 或 alertLocalizationKey?如果您这样做,那么您将已经从操作系统收到通知,并且您不需要设置本地通知。

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

于 2015-04-30T06:27:19.350 回答
4

我遇到了同样的问题,当应用程序不在前台时,我花了几个小时来制作推送通知。

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

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

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

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

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

于 2015-07-15T00:16:17.680 回答