APNs

APNs( Apple Push Notification service

相信有在開發 iOS app 的開發者,對於這個詞應該都不會太陌生;

簡單來說,它就是推播的功能。

而推播其實有分成兩種:

  1. Local notification
  2. Remote notification

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

Local notification

本地推播在 iOS 10 以後,可以參考 UserNotifications 這個 framework。

這邊附上以區域範圍為觸發條件的推播寫法:

而鬧鐘那種概念的,或是遊戲提醒(例如遊戲的愛心已經回滿了,趕快回來玩哦!),

這種以時間作為觸發條件的,則是設定 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 來實作打推播的動作,附上我的檔案

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

建置 Python 環境

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

可以下載 requirements.txt 放到和 .p8 及剛剛 .py 的同個資料夾,並執行

pip install -r requirements.txt

便會將所需要的套件下載安裝;

如果沒有安裝 pip⋯⋯建議可以自行先去 Google 一下XDD

萬事俱備後

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

  1. Test Title:推播的標題
  2. Test Body:推播的內容
  3. device token:要收到推播的裝置 token
  4. False:我最後一個參數是來控制要打給 production server 還是 development server

Python 和 Swift 看起來有點類似,所以應該不難看懂 APNs.py 是在幹嘛~

有問題可以留言給我,或是留在 gist 上!

 

更新:

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

 

最後

如果這篇文章對你有一點點幫助的話,可以幫我點個廣告來維持這網站的伺服器月費,

或是在相關的 gist 上給個 Star 鼓勵鼓勵!

對「APNs」的想法

  1. 不好意思
    我想問一下
    如果我想把推播的整個流程全都做在swift裡面可以做到嗎?
    因為之前.p12的時候
    我是import alamofire來直接做推播
    (按下某個按鍵後會透過alamofire 推播到指定的deviceToken)//平台是firebase

    如果使用你的做法那就不需要使用firebase對吧!?

    不好意思目前剛接觸這部分…還請多見諒>//<

    • 可以,Python 只是個語言,整體來說推播的概念就是把某包東西打給 Apple,
      然後它會解析完之後做後續的動作。

      Firebase 也是類似的意思,它會請你上傳 .p12,
      意思就像是文中將 .p8 檔案放到一樣的資料夾中;
      接著 Firebase 會提供給你 API(如同我的 ApnsPusher 會提供 push 的 method),
      讓你做呼叫的動作。

      不過 .p8 包到 app 裡頭有點危險XD
      因為 .p8 是可以打你所有這個 team ID 的 app。

      有問題可以儘管問,如果我能幫到你的話XDD

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s