在后台使用didReceiveRemoteNotification

Erw*_*win 52 iphone apple-push-notifications ios4

这样的问题已被多次询问,但我有一些特定的情况正在发生.

当我的应用程序处于活动状态并且我收到PUSH消息时,我成功地能够解析自定义有效负载等.

但是当我的应用程序在后台并且PUSH到达时,用户必须单击"查看/打开"按钮才能获得didReceiveRemoteNotification被叫,然后didFinishLaunchingWithOptions被调用.

我需要让我的应用程序决定是否必须在后台提示用户使用UIAlert,或者根据某些本地设置禁止推送消息.

任何帮助,将不胜感激,

Bog*_*tyr 150

您的应用需要处理所有可能的推送通知交付状态:

  • 您的应用刚刚推出

  • 你的应用程序只是从背景到前景

  • 您的应用已在前台运行

您无法在交付时选择使用哪种演示方法来呈现推送通知,该推送通知在通知本身中编码(可选警报,徽章编号,声音).但是,由于您可能控制了推送通知的应用程序和有效负载,因此您可以在有效负载中指定是否已经向用户显示了警报视图和消息.只有在应用程序已经在前台运行的情况下才知道用户不是通过警报或定期从主屏幕启动应用程序.

你可以使用这段代码判断你的应用程序是否只是在didReceiveRemoteNotification中被带到了前台:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateActive )
        // app was already in the foreground
    else
        // app was just brought from background to foreground
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的应用程序在pn出现后处于bg状态,您将会被系统注意到.如果您忽略该通知并稍后将您的应用程序带到fg(因为徽章仍在那里),您无需更改即可检索pn.我的意思是:当app在bg中时,没有调用didReceiveRemoteNotification (6认同)
  • @neil:你对"你"的使用含糊不清,你需要区分用户,系统和应用程序的动作.如果应用程序处于后台或未启动且用户点击"取消",则不会向应用程序发送任何通知.如果用户点击"查看",则有两种情况:应用程序在后台,应用程序未启动.如果应用程序位于前台,则会占用第3个交付案例,因此我的答案中有3个案例.显然,如果app在后台,并且用户点击"取消",则没有任何内容被传递,并且没有什么可以处理的. (2认同)

San*_*mar 14

通过content-available = 1您的有效负载,didReceiveRemoteNotification即使在后台也会调用.例如

{
    "alert" : "",
    "badge" : "0",
    "content-available" : "1",
    "sound" : ""
}
Run Code Online (Sandbox Code Playgroud)

  • 不,它没有.我不止一次测试它,"content-available"与Background Fetch一起使用并且它不是100%可靠,因为iOS决定何时开始后台获取 (6认同)

Alb*_*toC 14

当应用程序处于后台时,您必须执行多项操作才能管理收到的推送通知.

首先,在服务器端,您必须设置{"aps":{"content-available" : 1... / $body['aps']['content-available'] =1;推送通知有效负载.

其次,在你的Xcode项目中,你必须支持"远程通知".它是通过转到项目的目标 - >功能,然后启用功能切换,并选中远程通知复选框.

第三,不必使用didReceiveRemoteNotification,你必须打电话 application:didReceiveRemoteNotification:fetchCompletionHandler:,这将允许你在接收通知时在后台执行你想要的任务:

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

 if(application.applicationState == UIApplicationStateInactive) {

     NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background");
     //do some tasks
    [self manageRemoteNotification:userInfo];
     completionHandler(UIBackgroundFetchResultNewData);
 }
 else if (application.applicationState == UIApplicationStateBackground) {

     NSLog(@"application Background - notification has arrived when app was in background");
     NSString* contentAvailable = [NSString stringWithFormat:@"%@", [[userInfo valueForKey:@"aps"] valueForKey:@"content-available"]];

     if([contentAvailable isEqualToString:@"1"]) {
         // do tasks
         [self manageRemoteNotification:userInfo];
         NSLog(@"content-available is equal to 1");
         completionHandler(UIBackgroundFetchResultNewData);
     }
 }
 else {
     NSLog(@"application Active - notication has arrived while app was opened");
        //Show an in-app banner
         //do tasks
        [self manageRemoteNotification:userInfo];
         completionHandler(UIBackgroundFetchResultNewData);
     }
 }
Run Code Online (Sandbox Code Playgroud)

最后,您必须UIRemoteNotificationTypeNewsstandContentAvailability在设置时将此通知类型添加到通知设置中.

除此之外,如果你的应用程序在通知到达时关闭了,你必须管理它didFinishLaunchingWithOptions,并且只要用户点击推送通知:这样做的方式是:

if (launchOptions != nil)
{
    NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    if (dictionary != nil)
    {
        NSLog(@"Launched from push notification: %@", dictionary);
        [self manageRemoteNotification:dictionary];
    }
}
Run Code Online (Sandbox Code Playgroud)

当您通过点击推送通知启动应用程序时,launchOptions为!= nil,如果您通过点击图标来访问它,则launchOptions将为== nil.

我希望它会有用.这是Apple解释的.


Di *_* Wu 8

需要记住的一点是,当您的推送消息到达用户的iPhone并且他们点击"取消"时,除了图标徽章编号(他们将由操作系统处理),您将无法进入 - 了解此推送活动的背景应用程序,并采取任何进一步的行动.

  • 向Apple发送电子邮件并要求他们提供API以支持您的需求:-) (4认同)