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.

转载于:https://www.cnblogs.com/studyNT/p/5198431.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值