2012年2月1日 星期三

Push Notification簡介

上一篇文章的push notification - step by step主要是以實作來去撰寫
但想說網路上中文的push notification的文章真的很少
那我就再來寫一篇來介紹ios push notification

push notification主要由三方溝通
也就是iOS device, provider, APNS (apple push notification service)
其中iOS device中又可以把iOS系統層跟application分開來


1. iOS跟APNS的SSL連線
這個連線是我們開發者不會直接接觸的,
是iOS系統層跟APNS索建立的連線
透過這個唯一的連線
iOS系統可以統一的處理所有application跟apns中間的溝通
裡面走的是jabber/xmpp的protocol, APNS port是5223

2. provider跟APNS的SSL連線
這個連線是讓provider server去通知APNS去notify device用的
這個SSL certification key是要在iOS provision portal在app id那邊產生的
裡面走的protocol是apple定義的一個binary protocol
又分simple跟advanced兩種格式
詳見 http://goo.gl/2EB9J
而APNS port是2195

3. Application在啓動的時候需要呼叫- [UIApplication registerForRemoteNotificationTypes:]
來去跟iOS註冊要使用push notification
如果註冊成功的話,iOS會回呼 -[UIApplicationDelegate application:didRegisterForRemoteNotificationsWithDeviceToken:]
此時可以取得一個32bytes的device token

4. 當第三步的registration成功後,application需要跟provider告知我的device token是什麼。
因為這個是屬於application developer的自訂邏輯,
怎麼樣跟provider server告知這個device token完全看自己的需求設計
而provider要做的就是要把iOS傳來的device token放進provider的DB當中,
以便當有通知要觸發的時候,可透過provider<->APNS的connection來觸發通知的動作


至於當Device收到push notification之後會發生什麼事情?
如果App是在還沒被啟動的狀況下被呼叫,則device會出現類似下面的畫面。
使用者如果選擇執行這個notification,
則你的應用程式會被打開
並且呼叫 - [UIApplicationDelegate application:didFinishLaunchingWithOptions:]
透過第二個參數的地方可取得此notification的資料

相對的,如果我們的App在notification來之前已經是在執行的狀態了
則底層會改呼叫- [UIApplicationDelegate application:didReceiveRemoteNotification:]


push notification的packet可以做的事情不多
裡面只能放alert body, badge number, sound, launch image, 以及custom defined key/value
而這些資料要以json格式描述並且要在255 bytes之中…
但最重要的是,它提供了一個完美機制讓我們的應用程式即使沒有在運作,
但透過遠端的觸發,讓事件發生時,可以通知使用者喚醒你的App。


Reference
[1] Local and Push Notification Programming Guide
[2] Using Local and Push Notifications

5 則留言:

  1. 我是個新手,看你的文章獲益良多。謝謝~

    回覆刪除
  2. HELLO !
    想請問APNS規範
    在simulator上可以跑嗎?
    還是 一定要在device上面

    thk~!

    回覆刪除