如何捕捉所有iOS推送通知与不同的用户操作,包括点击应用程序图标

根据苹果指南:

“通过提示通知,用户点击提醒的操作button或点击(或点击)应用程序图标,如果点击操作button(在运行iOS的设备上),系统启动应用程序和应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法(如果已实现);它传入通知有效内容(用于远程通知)或本地通知对象(用于本地通知)。

如果在运行iOS的设备上点击应用程序图标,应用程序将调用相同的方法,但不提供有关通知的信息。 如果在运行Mac OS X的计算机上单击应用程序图标,应用程序将调用代理的applicationDidFinishLaunching:方法,在该方法中代理可以获取远程通知有效内容。

我的问题是,假设用户得到了来自提供商的3-4推送通知,并且所有都存储在苹果的通知中心。 如果用户点击通知提醒,他/她可以很容易地在应用程序中获取通知数据。 但是,如果用户点击iPhone上的应用程序图标,如何获取所有以前的通知相关的所有数据。

提前致谢!

您不能,您只会收到有关用于打开您的应用程序的通知的信息。

所以,如果用户打开您的应用程序,并且您的应用程序有通知,您将无法在应用程序中使用它们检索它们。

解决办法可能是也跟踪服务器上的通知,并在应用程序中处理。 因此,服务器保持跟踪哪个通知被读取。 Facebook就是这么做的。

要正确地做到这一点,必须满足一些条件:

您的服务器知道您的应用目前已经看到了什么,以及可以再次发送什么通知。

我们只考虑远程通知。 有三种状态的应用程序:

  • FOREGROUND

    • 通知出现在用户的操作之下:

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { //handle your notification } 

    您可以使用第三方库显示横幅: BSForegroundNotification

  • 背景

    • 通知出现在屏幕上。 (请注意,在推送通知中设置content-available = 1可能会导致在按下应用程序图标时看到最新的推送消息,就像didReceive … 调用一样)。

       //nothing is called in the app, but app icon badge changes // OR - if the notification contains the field content-available set to 1 - func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { //handle your notification } 
    • 用户点击通知

       func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { //handle your notification } 
    • 用户采取通知行动

       func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) { //handle your notification's action } 

      要么

       func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) { //handle your notification's action response info } 
    • 用户点击应用程序图标

       func applicationDidBecomeActive(application: UIApplication) { //fetch pending notifications from server } 
  • 没有运行在所有

    • 通知出现在屏幕上。

       //nothing is called in the app, but app icon badge changes 
    • 用户点击通知

       func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject: AnyObject] { //handle your notification } } 
    • 用户采取通知行动

       func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) { //handle your notification's action } 

      要么

       func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) { //handle your notification's action response info } 
    • 用户点击应用程序图标

       func applicationDidBecomeActive(application: UIApplication) { //fetch pending notifications from server } 

如何处理通知?

  1. let notification = WLNotification(userInfo: userInfo)

    WLNotificationWLNotification记住当您收到通知时保持当前的应用程序状态。 将来您可能需要知道该通知的来源。

  2. WLNetworkClient.sharedClient().notificationForIdentifier(notification.identifier)

    从服务器获取有关该通知的详细信息,同时让它知道您是否真的获得该通知,并影响用户的数据。

如何获取所有待处理的通知?

 WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil) 

获取您错过的所有通知。 换句话说,取出那些没有标记在服务器上的那些,就像你收到的那样。

阅读苹果推送通知的限制 。

看到相关的问题:

  • 如何确保iOS应用程序收到服务器发送的每个推送通知?

我有同样的问题:如果用户点击推横幅他得到的信息在应用程序,如果他点击应用程序图标,他不明白。 你可以处理派生的,但只有一些限制。 例如,如果您想要推送徽章号码,可以这样做:(推 – >应用程序图标 – >应用程序图标徽章 – >您的变种)

在AppDelegate

 - (void)applicationWillEnterForeground:(UIApplication *)application { newMessages = application.applicationIconBadgeNumber; } 

从概念上讲,当应用程序加载时,通过单击针对推送通知呈现的警报视图,如果您的应用程序在后台,应用程序将使用didReceiveLocalNotification委托方法启动。 此时applicationDidFinishLaunching委托方法不被调用。

当您的应用程序不在后台时,单击提示通知的警报视图将调用applicationDidFinishLaunching方法。

希望这清楚你在这两个委托方法之间的理解。

你可以使用这个代码:

  NSArray *pendingNotifications = [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingComparator:^(id obj1, id obj2) { if ([obj1 isKindOfClass:[UILocalNotification class]] && [obj2 isKindOfClass:[UILocalNotification class]]) { UILocalNotification *notif1 = (UILocalNotification *)obj1; UILocalNotification *notif2 = (UILocalNotification *)obj2; return [notif1.fireDate compare:notif2.fireDate]; } return NSOrderedSame; }]; // if there are any pending notifications -> adjust their badge number if (pendingNotifications.count != 0) { //do something }