收到apns时的后台任务

时间:2014-02-28 09:22:28

标签: ios objective-c apple-push-notifications nsurlconnection

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

这是我在通知中的字典:

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

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

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{     
    [HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]];

    NSLog(@"Received notification: %@", userInfo);  
}

但是,当应用程序处于后台时,apns不会执行“didReceiveRemoteNotification”,所以我想执行该方法:

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

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

有什么办法吗?

非常感谢!

3 个答案:

答案 0 :(得分:6)

是的,自iOS 7起,这是可行的,您需要将remote-notification添加到应用UIBackgroundModes中的info.plist

然后在您的app委托中实施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类型。

答案 1 :(得分:2)

Source from Apple Documentation:

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


          }

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

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

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

答案 2 :(得分:0)

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

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