2013-10-15 100 views
8

我正在使用parse.com作为我正在构建的测试应用程序的APNs提供程序。我已经确认推送通知正在工作,因为我已经能够在应用处于前台时成功接收提醒。此外,我有我的plist中指定的UIBackgroundModes密钥的remote-notification值。后台中的Apple推送通知

在我的应用程序中,我希望在收到推送通知时将用户的当前位置数据发回给我的特定于应用程序的parse.com数据库。我实际上并不关心通知有效载荷本身,因为通知只是获取一小段信息的一种手段。该应用程序不断在后台收集数据并将其存储在持久的NSDictionary中。

我已经把位置发送代码放在application:didReceiveRemoteNotification:方法中。如果我的应用在我收到通知时处于前台,该方法会被调用。如果我的应用程序在后台,该方法不会被调用。

  • 我做错了什么?
  • 它甚至有可能当应用程序在后台运行,并且用户还没有与通知互动中application:didReceiveRemoteNotification:执行API请求**

编辑:的问题依然存在,甚至当我使用application:didReceiveRemoteNotification:fetchCompletionHandler:

注意:我的NSDictionary充满了位置数据不是空的。另外,我并不试图在后台执行任何UI操作 - 只是尝试执行API请求。

回答

15

检查以下内容:

  • 通知有效载荷包括 “内容提供”
{"alert":"", 
"badge":"0", 
"content-available":"1", 
"sound":""} 
+0

工作!我在AppDelegate中打开了'content-available'标志,但没有在我的JSON APN中推送该标志。谢谢,亚历克斯!这解决了这个问题。 – ArtSabintsev

+0

哈,奇怪。它只有一次工作。将调查并回复给你 – ArtSabintsev

+0

没关系,让它工作!这只是从解析中接收数据的延迟。 – ArtSabintsev

0

documentation for UIApplicationDelegate -application:didReceiveRemoteNotification是这种方法相当清楚:

如果在推送通知到达时,应用程序没有运行,该方法 启动应用程序,并提供了 启动选项字典中的相应信息。该应用程序不会调用此方法来处理推送通知的 。相反,您的应用程序的实现:willFinishLaunchingWithOptions:或 应用程序:didFinishLaunchingWithOptions:方法需要获取 推送通知有效负载数据并进行相应的响应。

您需要在两种方法中处理通知,以便能够在应用程序处于后台和前台时作出响应。

+0

我想我明白'不running'为完全关闭,不'inactive'或'background'模式。我会暂时尝试一下,如果能够正常工作,请将您的答案标记为正确。 – ArtSabintsev

+0

它仍然无法正常工作。我现在试图从'application:didFinishLaunchingWithOptions:'和'application:didReceiveRemoteNotification:'发送位置数据。如果应用程序位于后台(例如,我按下了主页按钮),则不会发送任何数据,除非我与通知进行交互。如果我通过单击它来与通知进行交互,则会输入'application:didReceiveRemoteNotification:'方法。我究竟做错了什么?我从根本上误解了背景通知应该如何工作? – ArtSabintsev

+0

我认为我的应用程序实际上处于“挂起”状态,而不是“背景”状态。我认为这可能是造成这个问题的原因。 – ArtSabintsev

0

,你可以尝试使用,而不是这个

application:didReceiveRemoteNotification 

方法,因为您需要在后台模式下获取您的推送,因此,当应用程序处于后台模式时,这将起作用。但是,您可能需要在应用处于前台时添加自定义通知或UIAlertView以显示您的消息。希望它有帮助,而且还不算太晚。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 

    NSLog(@"Remote Notification Received: %@", userInfo); 

    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"message to be displayed"; 
    notification.applicationIconBadgeNumber = 1; 


    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
    completionHandler(UIBackgroundFetchResultNewData); 

} 
0

亚历克斯·L的答案几乎工作我。

只需确保价值content-available为1(数字),而不是一个字符串 “1”:

{ 
    "alert":"", 
    "content-available":1, 
    "sound":"" 
} 

badge参数是可选。

(使用解析服务器进行的APN)