4

当iOS8.2,应用程序在后台运行,它不接受任何推送通知运行,CloudKit推送通知,应用程序在后台

它是在前台运行,而如果它收到推送通知罚款。

任何想法是怎么回事?

运行在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

当你去到你的应用程序设置功能,你有没有后台启用远程通知模式?

看到这个截图: enter image description here

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

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

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

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

+0

嗨@Edwin yes后台提取和远程通知处于打开状态。还有什么明显的可能会被遗漏? – Porton

+0

在您的订阅中,您是否为CKNotificationInfo发送alertBody或alertLocalizationKey?然后,您将已经从操作系统获得通知,并且不需要设置本地通知。但是,然后通知应该已经到达。特别是当你说他们到达应用程序活动时。 –

+0

您是否注册过所有类型?在awnser中看到额外的评论 –

4

我有同样的问题,并花了几个小时使应用程序不在前台时推送通知的工作。

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

但是,如上所述,没有alertBody,方法didReceiveRemoteNotification在应用程序不在前台时未被调用。

我终于尝试设置alertBody是一个空字符串:

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

现在,它的工作原理:即使在应用程序不活跃,且没有警报消息显示给用户didReceiveRemoteNotification被调用。