收到apns时的后台任务

阅读APNS文档后,我已经在我的应用程序中实现了apns。 一切都很好,但我有一个问题。 我不知道是否有可能,但我想在我的应用程序处于后台并且收到apns通知时执行任务。

这是我在通知里面的字典:

aps = { alert = "message"; sound = "default"; }; 

如果我的应用程序在前台,我执行此代码:

 - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { [HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]]; NSLog(@"Received notification: %@", userInfo); } 

但是当app在后台时,apns不会执行“didReceiveRemoteNotification”,所以我想执行该方法:

 [HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]]; 

如果我在后台收到apns通知。

有什么办法吗?

非常感谢!

是的,自iOS 7起,这是UIBackgroundModes ,您UIBackgroundModes在应用程序info.plistUIBackgroundModes中添加remote-notification

然后在你的app delegate中实现application:didReceiveRemoteNotification:fetchCompletionHandler: 您将有30秒的时间来获取数据,如果您的应用程序需要更长时间,系统可能会终止您的数据。

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler { NSString *stringURl = /* some URL */; [HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]]; // Once done call handler with one of the result types: // UIBackgroundFetchResultNewData, UIBackgroundFetchResultNoData, UIBackgroundFetchResultFailed handler(UIBackgroundFetchResultNewData); } 

您必须在完成调用时通知系统,并通过调用处理程序获取数据。 如文档所述,如果您成功获取任何数据,则需要告诉处理程序:

处理器

下载操作完成时要执行的块。 调用此块时,传入最能描述下载操作结果的获取结果值。 您必须调用此处理程序,并应尽快执行此操作。 有关可能值的列表,请参阅UIBackgroundFetchResult类型。

来自Apple文档的来源:

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

与应用程序:didReceiveRemoteNotification:方法不同,该方法仅在您的应用程序运行时调用,无论您的应用程序状态如何,系统都会调用此方法。 如果您的应用程序已暂停或未运行,系统会在调用该方法之前唤醒或启动您的应用并将其置于后台运行状态。

调用此方法时,您的应用程序最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。 实际上,您的应用程序应在下载所需数据后尽快调用处理程序块。 如果您未及时致电处理程序,您的应用程序将被暂停。 更重要的是,系统使用经过的时间来计算应用程序后台下载的功耗和数据成本。 有关支持推送通知的后台操作的更多信息,请参阅“ iOS应用程序编程指南 ”中的“ 应用程序状态和多任务 ”。

Tom更新:但是,如果用户强行退出,系统不会自动启动您的应用程序。 在这种情况下,用户必须重新启动应用程序或重新启动设备,然后系统才会再次尝试自动启动应用程序。

如果您的意思是,在用户点击通知后,您应该检查- (BOOL)application:didFinishLaunchingWithOptions:是否存在UIApplicationLaunchOptionsRemoteNotificationKey - (BOOL)application:didFinishLaunchingWithOptions: ,例如:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSDictionary *rNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if(remoteNotifDic) { NSString *myAlertString=rNotif[@"aps"][@"alert"]; //... } }