当app在后台时,将触发哪种方法进行推送通知?

时间:2014-01-13 11:03:50

标签: ios iphone apple-push-notifications

我已在我的应用中实施推送通知。当App处于前台时didReceiveRemoteNotification方法被调用。但是当app在后台时,不会调用此方法。服务器端使用以下模式:

{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

但仍然没有调用didReceiveRemoteNotification。推送通知到达后,还有什么方法可以触发该方法。

4 个答案:

答案 0 :(得分:3)

当设备收到推送通知时,有一个新的API可用于处理后台事件:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler

现在,根据文档:

  

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

     

调用此方法时,您的应用最长可达30秒   挂钟时间执行下载操作并调用   指定的完成处理程序块在实践中,您的应用应该致电   下载所需的后尽快处理程序块   数据。如果您未及时致电处理程序,您的应用程序将被暂停。   更重要的是,系统使用经过的时间来计算功率   应用后台下载的使用情况和数据费用。

要触发此方法,通知有效内容必须包含密钥content-available

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}

示例代码:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification userInfo is %@", userInfo);

    NSNumber *contentID = userInfo[@"content-id"];
    // Do something with the content ID
    completionHandler(UIBackgroundFetchResultNewData);
}

答案 1 :(得分:2)

当推送通知到达应用程序活动状态时,将调用

didReceiveRemoteNotification方法。 如果应用程序在推送通知到达时处于非活动状态,则调用didReceiveRemoteNotification方法的选项是从通知列表中单击收到的通知并变为活动状态。 如果app在推送通知到达时处于非活动状态并且在未单击收到通知的情况下变为活动状态,则通常无法调用didReceiveRemoteNotification方法。

如果您需要,可以通过自定义服务器处理它。每当应用程序变为活动状态时,都可以实施API调用以列出待处理的通知。

答案 2 :(得分:0)

这将被称为:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

检查launchOptions

  NSDictionary *pushInformation = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
  if(pushInformation)
  {
    // App opened with push notification
  }

答案 3 :(得分:0)

didReceiveRemoteNotification如果您的应用位于UIApplicationStateActive

,则会被调用 如果您的应用位于didReceiveRemoteNotificationUIApplicationStateBackground,并且用户已从通知中心打开推送通知,则会调用{p> UIApplicationStateInactive

如果app不在后台,则会在启动时调用

didFinishLaunchingWithOptions

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    if (application.applicationState == UIApplicationStateActive )
    {
       //Your Code here
    }
    else if (application.applicationState == UIApplicationStateBackground || application.applicationState == UIApplicationStateInactive)
    {
        //Your code here
    }
}