JSON Web Token

JWT

JWT( JSON Web Token)和 iOS 比較有相關聯的地方,

便是在於 APNs p8 是使用 JWT 格式作為傳遞;

而有關於 JWT 的相關資料,可以參考 [這個網站](https://jwt.io/introduction/)。

以之前所提到的 [APNs](https://www.archie.tw/apns) 來說,是由三個部分所組成:

  1. Header
  2. Payload
  3. Verify signature

Header

在 APNs 裡頭,需要包含這兩者

  • alg:所使用的加密方式(algorithm),p8 是使用 ES256 作為加密方式
  • kid:鑰匙的 ID(key identifier)

例如:

alg: ES256

kid: 12345678

Payload

  • iss:所發送的人(issuer),這邊為開發者的 Team ID
  • iat:所發送的時間(issued at)

Verify signature

這邊便是將上述兩者,分別做 base 64 加密後輸出成字串,再加上 p8 的 key,

一起做 ES256 加密後的結果,所以大概長這樣:

{header base 64 encode}.{payload base 64 encode}.{ES256 hash[(header base 64 encode).(payload base 64 encode),key]}

Swift 版本的 APNs

這幾天便是在研究如何在 Swift 中,實做推播的功能,目前卡在內建的加密方式是 HMAC 的為主,

並沒有 ECDSA p-256 的方式(ES256 = ECDSA p-256 加上 SHA 256),

故加密那段仍未能完成。

徵求

對 ES256 有研究的大大,分享一下如何在 Swift 上實作 ES256 加密!

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 鼓勵鼓勵!