zoukankan      html  css  js  c++  java
  • APN 推送

    推送的各种状态

    http://samwize.com/2015/08/07/how-to-handle-remote-notification-with-background-mode-enabled/




    2 min read

    iOS push notification has evolved greatly over the years, from a simple push with a alert string, to the now sophisticated system involving custom actions, localized string and background mode.

    Reading the documentations herehere and here... provided clues everywhere on how it works.

    This post is to explain what happens when a push reaches a device.

    Which delegate method is called?

    That is the question to answer when a push reaches a device.

    Three possible callbacks:

    1. application:didReceiveRemoteNotification:fetchCompletionHandler:
    2. application:didFinishLaunchingWithOptions:
    3. No callback

    There are other callback methods in UIApplicationDelegate, but we leave omit them in this discussion unless it is needed. Specifically they are:

    • application:didReceiveRemoteNotification: - This is the original API when push notification service is launched (iOS 3.0), but now it is superceded byapplication:didReceiveRemoteNotification:fetchCompletionHandler: (iOS 7.0).
    • application:handleActionWithIdentifier:forRemoteNotification:completionHandler:- This is for providing custom action that goes with a push notification (iOS 8.0). An advanced topic we shelf off for now.

    Configuring The Payload & Silent Push

    The push notification payload consists of:

    • alert - the alert string and actions
    • badge
    • sound
    • content-available

    The key content-available is a new feature, and it is this key that makes silent pushpossible.

    To enable, you also have to add remote-notifcation as your appUIBackgroundModes as described here.

    This is what happens when content-available is in the payload:

    • If app is Suspended, the system will bring it into Background
    • If app was killed by user, nothing happens and app remains in Not Running

    Read about app state changes.

    A potential is pitfall:

    You enable with content-available=1. But, it is WRONG to disable with content-available=0. To disable, you have to REMOVE the key in the payload.

    Playing out the Scenarios

    With content-available enabled:

    1. App is in Foreground
      • No system alert shown
      • application:didReceiveRemoteNotification:fetchCompletionHandler: is called
    2. App is in Background
      • System alert is shown
      • application:didReceiveRemoteNotification:fetchCompletionHandler: is called
    3. App is in Suspended
      • App state changes to Background
      • System alert is shown
      • application:didReceiveRemoteNotification:fetchCompletionHandler: is called
    4. App is Not Running because killed by user
      • System alert is shown
      • No callback is called

    With content-available disabled (key removed):

    1. App is in Foreground
      • No system alert shown
      • application:didReceiveRemoteNotification:fetchCompletionHandler: is called
    2. App is in Background or Suspended
      • System alert is shown
      • No method is called, but when user tap on the push and the app is opened
        • application:didReceiveRemoteNotification:fetchCompletionHandler:is called
    3. App is in Not Running
      • System alert is shown
      • No method is called, but when user tap on the push and the app is opened
        • application:didFinishLaunchingWithOptions: thenapplication:didReceiveRemoteNotification:fetchCompletionHandler:are both called

    Conclusion

    If app is in Foreground, the system will not show the alert and it is up to the app to display some UI afterapplication:didReceiveRemoteNotification:fetchCompletionHandler: is called.

    Enabling content-available will put the app in Background (unless app was killed by user) and then callapplication:didReceiveRemoteNotification:fetchCompletionHandler:immediately.

    Whereas without content-available, app will remain in Suspended, andapplication:didReceiveRemoteNotification:fetchCompletionHandler: is delayed until the app is opened.

    Lastly, application:didFinishLaunchingWithOptions: is called only when the app is Not Running, and the user tap on the push alert. It will subsequently callapplication:didReceiveRemoteNotification:fetchCompletionHandler:. Therefore, it is better to handle the push inapplication:didReceiveRemoteNotification:fetchCompletionHandler:, as that covers all scenarios.

  • 相关阅读:
    oracle数据库版本进化的关键节点
    到底什么是数据库呢?
    迁移数据之后,读取数据库变得很慢
    为什么越来越多的人使用python呢?
    20135306 2.4 ELF文件格式分析
    20135306 2.3程序破解实践
    20135306黄韧模块实践报告
    Linux内核学习总结
    Linux内核分析期中知识点总结
    LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
  • 原文地址:https://www.cnblogs.com/studyNT/p/5198431.html
Copyright © 2011-2022 走看看