访问上次收到的已关闭/忽略的推送通知

Posted

技术标签:

【中文标题】访问上次收到的已关闭/忽略的推送通知【英文标题】:Accessing Last received push notification which was closed / ignored 【发布时间】:2012-06-29 06:29:44 【问题描述】:

我成功地在我的设备上接收到警报类型的推送通知。

1.活动状态或应用处于前台

didReceiveRemoteNotification 方法被应用程序调用。在这里我可以访问收到的通知消息。

2。处于活动状态或应用在后台

推送通知的消息显示在带有“查看”和“关闭”按钮的警报框中。

一个。单击“查看”按钮后,将调用 didReceiveRemoteNotification 方法。我再次可以访问收到的通知消息。

b.单击“关闭”按钮后,消息将消失。在这种情况下,我没有关于最后收到的推送通知的任何处理程序。

3.应用不在后台或应用未运行

与案例 2 相同。

4. iPhone 处于睡眠模式

警报显示有消息,但没有“查看”或“关闭”按钮。

一个。在 UI 上,它将显示“Slide to View”。如果用户与手机交互,它将打开应用程序。我可以访问收到的通知消息。

b.如果用户不交互并允许手机进入睡眠模式或手动将手机置于睡眠模式,则下次 ios 会显示“滑动解锁”消息。在这里,我没有任何最后一个推送通知的处理程序。

如何访问案例 2.b 和 4.b 的最后一次推送通知,是否有任何我缺少实现的最佳调用方法。

编辑1:下面是我的appDelegate代码

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

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[Test1ViewController alloc] initWithNibName:@"Test1ViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    // For PUSH NOTIFICATION
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    if (launchOptions != nil)
    
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        
            NSLog(@"Launched from push notification: %@", dictionary);
        
    


    return YES;


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

    NSLog(@"Received notification: %@", userInfo);
    // Received Notification at here ....
    // Now based on response further to do ...


- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

    NSLog(@"My token is: %@", deviceToken);


- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error

    NSLog(@"Failed to get token, error: %@", error);

谢谢, J61

【问题讨论】:

【参考方案1】:

操作系统会处理徽章。但是,如果用户关闭了您的推送通知,您的应用可以查看您服务器上的消息并在错过任何用户关闭的通知时以适当的方式处理它。

取自here,这是您可以处理通知的方式:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
   // get state
   UIApplicationState state = [application applicationState];
   if (state == UIApplicationStateActive) 
      // App is in foreground
    else 
      // App is suspended
   

   application.applicationIconBadgeNumber = 0;


编辑: 如果您想自动增加您的徽章编号,您需要自己跟踪计数。您可以在您的服务器上执行此操作。如果您的推送消息不包含徽章计数,iOS will remove it from your application。

【讨论】:

我想,我必须保持收到的消息计数,并且基于此我只需要检查丢失的消息。这是目前唯一更好的解决方案。 如果您保留徽章数量,这当然是一种确定是否需要检查新消息的方法。 我尝试了徽章编号,但问题是我的应用图标上的徽章编号没有增加。 请检查我在问题本身中编辑的代码。

以上是关于访问上次收到的已关闭/忽略的推送通知的主要内容,如果未能解决你的问题,请参考以下文章

收到推送通知后如何触发操作[关闭]

在活动中存储/保存收到的推送通知[关闭]

当我的 iPad 关闭时,只收到最后一个推送通知

在关闭的应用程序上未收到推送通知

关闭推送通知横幅

在选择收到的推送通知时获取 APNS 有效负载内容 [关闭]