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

Kir*_*ity 26 push objective-c apple-push-notifications ios swift

根据Apple指南:

"作为呈现通知的结果,用户点击警报的操作按钮或点击(或点击)应用程序图标.如果点击操作按钮(在运行iOS的设备上),系统启动应用程序和应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法(如果已实现);它传递通知有效负载(用于远程通知)或本地通知对象(用于本地通知).

如果在运行iOS的设备上轻触应用程序图标,则应用程序会调用相同的方法,但不会提供有关通知的信息.如果在运行Mac OS X的计算机上单击应用程序图标,则应用程序将调用委托的applicationDidFinishLaunching:方法,其中委托可以获取远程通知有效负载.

我的问题是假设用户从提供商那里得到3-4个推送通知,所有这些都存储在苹果的通知中心.如果用户点击了通知提醒,他/她可以轻松地在应用中获取通知数据.但是,如果用户点击iPhone上的应用程序图标,如何获取所有先前通知的所有数据.

提前致谢!

rck*_*nes 40

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

因此,如果用户打开您的应用,并且您的应用有通知,那么您将无法在应用中检索它们.

解决方法可能是跟踪服务器上的通知并在应用程序中处理此问题.因此,服务器跟踪已读取的通知.Facebook就是这样做的.

  • 谢啦!其实我也有同样的想法.但我不确定.这意味着要阅读通知,用户必须单击通知栏.对? (2认同)
  • 我想知道为什么苹果不关心这些基本问题.Android在处理推送通知方面表现得很好. (2认同)

Bar*_*zyk 15

要以正确的方式做到这一点,必须满足一些条件:

您的服务器知道您的应用当前所看到的内容以及它可以再次发送的通知.

我们只考虑远程通知.app有三种状态:

  • FOREGROUND:

    • 在没有用户操作的情况下显示通知:

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }
      
      Run Code Online (Sandbox Code Playgroud)

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

  • 背景

    • 通知出现在屏幕上.(请注意,设定内容可用= 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
      } 
      
      Run Code Online (Sandbox Code Playgroud)
    • 用户点按通知

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

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

      要么

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

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      
      Run Code Online (Sandbox Code Playgroud)
  • 不要全力以赴

    • 通知出现在屏幕上.

      //nothing is called in the app, but app icon badge changes
      
      Run Code Online (Sandbox Code Playgroud)
    • 用户点按通知

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

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

      要么

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

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      
      Run Code Online (Sandbox Code Playgroud)

如何处理通知?

  1. let notification = WLNotification(userInfo: userInfo)

    WLNotification记得要保持当前应用状态,当你收到通知.将来您可能需要它来了解通知的来源.

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

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

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

WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil)
Run Code Online (Sandbox Code Playgroud)

获取您错过的所有通知.换句话说,获取那些未在您收到的服务器中标记的那些.

阅读Apple推送通知的限制.

查看相关问题: