APNs

APNs( Apple Push Notification service)

相信有在開發 iOS app 的開發者,對於這個詞應該都不會太陌生; 簡單來說,它就是推播的功能。 而推播其實有分成兩種:

  • Local notification
  • Remote notification 這兩者的差異就如同名字的一般,前者是本地的通知,後者為遠端的通知。

Local notification

本地推播在 iOS 10 以後,可以參考 UserNotifications 這個 framework。 這邊附上以區域範圍為觸發條件的推播寫法: https://gist.github.com/ArchieR7/85ee0a2d8cdd652d78d6c08eebfd0fae 而鬧鐘那種概念的,或是遊戲提醒(例如遊戲的愛心已經回滿了,趕快回來玩哦!), 這種以時間作為觸發條件的,則是設定 notification.fireDate,給它一個 Date 便會在那時候觸發。

Remote notification

遠端的推播則是如同聊天軟體常常收到的那種推播(OOO傳送貼圖給您!), 在 AppDelegate.swift 註冊那些的就不寫在這了~ 如果是在公司上班或者和後端合作,寫完註冊推播及回傳 deviceToken 和收到之後要幹嘛的動作, 通常就不會碰到「該如何打推播給 App」的問題,因為 iOS 只需要知道收到該怎辦XD 但總會有需要自己打推播測試、或是開發自己 app 的時候, 這邊就來談談 iOS 開發者該怎麼做!

APNs key

以往我們在產生 APNs key 的時候,是會得到一組有期限的 .p12 檔案, 其中不同的 bundle identifier 會配對到不同的 .p12 檔案; 這是一件蠻麻煩的事情,我們需要管理不同 App 的 APNs key, 上架 20 個有推播功能的 app,就需要維護 20 組 .p12 檔案。

有沒有比較方便的做法?

答案是,有! 如果你是看完這篇文章,才開始接觸推播的話, 那你應該已經找不太到 .p12 要去哪裡產生了! 前陣子是 .p12 和新的 .p8 同時共存在 Apple Developer 的頁面, 而目前畫面則長這個樣子:

在產生 keys 的頁面,我們可以看到只剩下「One key is used for all of your apps.」這種的(.p8), 也就是說,只需要一把 key 便可以打給你所有開發的 app,且它並不會過期! 產生完 key 之後,只有在當下可以下載 .p8 的檔案; 若你當下沒下載,就按完成的話,之後點開則會發現 Download 的按鈕是灰色不可按的, 所以需要好好保存,別把它搞丟了,否則只能夠重新產生一把新的來替換。

接下來?

有了 .p8 檔案之後,我是用 Python 來實作打推播的動作,附上我的檔案

apns_key_id = xxxxxxxxxx(你剛剛下載下來的 .p8 檔名) apns_key_name = ‘AuthKey_xxxxxxxxxx.p8’ team_id = 你的 developer team id bundle_id = 推播要送到哪個 bundle id

建置 Python 環境

這邊會需要安裝一些 python 的套件:

  • cryptography
  • pyjwt
  • hyper 可以下載 requirements.txt 放到和 .p8 及剛剛 .py 的同個資料夾,並執行 pip install -r requirements.txt 便會將所需要的套件下載安裝; 如果沒有安裝 pip⋯⋯建議可以自行先去 Google 一下XDD

萬事俱備後

把上述的檔案更改好後,和 .p8 放到同一個資料夾,接著開啟 terminal 執行 python。

from apns import ApnsPusher
ApnsPusher().push("Test Title", "Test Body", "device token", False)

Test Title:推播的標題 Test Body:推播的內容 device token:要收到推播的裝置 token False:我最後一個參數是來控制要打給 production server 還是 development server Python 和 Swift 看起來有點類似,所以應該不難看懂 APNs.py 是在幹嘛~ 有問題可以留言給我,或是留在 gist 上!

更新:

我將文中內的內容整理至 Github 上,有興趣的人也可以直接去那 clone 下來研究。

最後

如果這篇文章對你有一點點幫助的話,可以幫我點個廣告來維持這網站的伺服器月費, 或是在相關的 gist 上給個 Star 鼓勵鼓勵!

comments powered by Disqus