遠程推播通知(Apple Remote Notification)
遠程通知相對於本地通知要來得複雜許多,並不是它得必須要撰寫非常多的 程式碼去實現它,而是它必須和上架 App 一樣產生證書和設定很多東西才有辦法啟用此服務,說到和上架 App 一樣,那不就是要有開發者帳號?是的沒錯!設置的流程大同小異,差別只在於多了要開啟遠程通知這個服務如此而已。
而在開始實作之前我們得先來了解一下遠程通知。遠程通知在後台設定可分兩種,一種是沙盒通知(開發階段測試用的),另一種則是生產通知(上架後所用的),因為 Apple 把通知的環境切成測試機和正式機,而法蘭克僅針對前者做設定,因為沙盒通知若是行得通,基本上生產通知必定是可行的,只是別忘了上架前記得產生生產通知的 SSL 憑證。
另外每個遠程通知都是由 provider(發送通知的工具) 所提供的,且都必須經過服務器(Apple Push Notification Server,簡稱 APN Server),最後再送往 User Device(使用者的設備)。
總結來說:
- 遠程通知的生命週期為:
Provider → APN Server → User Device
- SSL 憑證分為開發和正式憑證。開發憑證僅能適用在沙盒環境;而正式的憑證則可以適用在沙盒和正式環境上。
有了遠程通知的基本觀念後,來說明一下今天要實作的範例,今天的範例僅會產生一個空的專案且只要寫一些少許的程式碼,而它的目的就只是用來接收 APN Server 發送的通知。
前置作業:
- 必須擁有 Apple 開發者帳號。
- 必須要有可以測試的裝置,例如 iPhone、iPad 等等。
- 建立一個空的專案,並把 Bundle ID 記下來因在後面會用到。
實作流程:
- 從 key chain 匯出 .certSigningRequest (CSR) 檔案。
- 登入開發者後台創建含有遠程通知服務 App IDs。
- 配置 App IDs 遠程通知的設定。
- 在開發者後台註冊接收遠程通知的設備(僅測試環境需要設定)。
- 在開發者後台配置 Provisioning Profiles(僅測試環境需要設定)。
- 配置 Xcode 的設定。
- 撰寫接收遠程通知的程式碼,並實作遠程通知的協議。
- 至 App Store 下載測試遠程通知的工具。
1. 從 key chain 匯出 .certSigningRequest (CSR) 檔案
1.1 打開 Launchpad 搜尋 key chain
1.2 選擇 左上鑰匙圈存取 → 憑證輔助程式 → 從憑證授權要求憑證
1.3 填入相關資訊後匯出 CSR
使用者電子郵件位址:Apple ID 的 email
一般名稱:英文名字
已將要求:儲存到磁碟
該 CSR 檔案後續會用到,請妥善保存。
2. 登入開發者後台創建含有遠程通知服務的 App IDs
2.1 登入後台的 Certificates, Identifiers & Profiles
2.2 在左列的選單選擇 App IDs 並點選「+」
2.3 註冊 App ID
Name :自行填入即可
Bundle ID:填入前置作業第 3 項的 Bundle ID
Enable Service :勾選 Push Notification
2.4 點擊下一步至完成設定
這邊會看到 Push Notification = Configurable 代表還沒設定完,暫且先點選 Done,等等再繼續設定。
3. 配置 App IDs 遠程通知的設定
3.1 點擊剛剛產生的 Test Remote Notification App ID 展開後,點選 Edit
3.2 往下滾找到產生測試時期通知的 SSL 證書(Development SSL Certificate),點擊 Create Certificate
3.3 滾到最下面點擊 Continue 開始上傳步驟 1 所產生的 .CSR 檔案
3.4 點擊 Choose File 選擇步驟 1 產生的 .CSR 檔案後點選 Continue。
3.5 下載 .cer 檔案
3.6 點擊兩下 .cer 檔案執行安裝
3.7 確認有無安裝至 key chain
點擊兩下 .cer 會自動安裝,待安裝完後會自動打開 key chain,這時請檢查 .cer 是否已安裝。若沒有自動打開 key chain,則可依步驟 1 的方式查看。
4. 在開發者後台註冊接收遠程通知的設備(僅測試環境需要設定)
先至後台確認測試的設備有無註冊過,若沒有才要執行註冊的動作,下圖表示已註冊過即可略過該第 4 大步驟。
4.1 開啟 Xcode 選擇 Window → Devices
4.2 複製 XXX 的 iPhond 的 Identifier
4.3 至開發者後台的 Devices 選單註冊該設備
5. 在開發者後台配置 Provisioning Profiles(僅測試環境需要設定)
5.1 在 Apple 開發者後台選取左側選單點擊 Provisioning Profiles下的 Development(開發時期測試用),並點選「+」號
5.2 選取 iOS App Development 後點選 Continue
5.3 選擇剛剛創建的 App ID 後點選 Continue
5.4 選擇 iOS 開發者證書,若不確認是哪一個的話,全部勾選亦可
5.5 選擇測試的設備
5.6 替 Profile 命名
5.7 下載 Test_Remote_Notification.mobileprovision 檔並點擊兩下執行安裝
6. 配置 Xcode 的設定
6.1 打開通知的設定
選擇專案 → TARGETS → Capabilities → ON
6.2 取消自動關聯簽署檔
選擇專案 → TARGETS → General → 取消勾選 Automatically manage singing
6.3 將 Test Remote Notification 的描述檔關聯進來
Signing(Debug) → Test Remote Notification
備註:Signing(Release) 是正式區的設定,若是 APP 要上架才需設定。
6.4 在 PROJECT 的 Code Signing 處設定正確的 Code Signing Identity
PROJECT → Build Settings → 搜尋code signing → 將 Debug 下的 ID 改為正確的
6.5 在 TARGETS 的 Code Signing 處設定正確的 Code Signing Identity
同 PROJECT 的設定方式
7. 撰寫接收遠程通知的程式碼,並實作遠程通知的協議
全部的設定到此已經告一個段落了,再來就是要在 AppDelegate.swift 撰寫一些程式碼了,包含詢問使用者是否接受通知、註冊推送通知、找出 deviceToken 等等。
7.1 產生詢問使用者是否接受通知的訊息並註冊遠程通知服務
● 第 2 行 => 同本地通知亦要引入 UserNotifications 的套件。
● 第 14~20 行 => 同本地通知亦也要詢問使用者是否接受通知。
● 第 23 行 => 註冊遠程通知,若沒註冊則無法啟用該服務。
7.2 實作 protocol 來取得 deviceToken
同上述程式碼
● 第 50~55 行 => 取得 deviceToken 後並將其轉成字串輸出到 console,這在下一個步驟會用到,用來給 provider 推送通知給 server 用的。
● 第 57~59 行 => 若註冊失敗會將原因輸出到 console。
7.3 取得 deviceToken
請將 App 安裝於設備上,因遠程通知在模擬器是無法運行的。執行該 App 取得 console 輸出的 deviceToken。
8. 至 App Store 下載測試遠程通知的工具
要測試遠程推送知道,就要有 Provider。Provider 為第三方開發的工具,在 App Store 可以找到很多類似的工具,法蘭克會使用 APN Tester Free 這套來做說明。
8.1 至 App Store 下載 APN Tester Free 工具
8.2 填入發送遠程通知所需要的資訊
Device Token:即步驟 7.3 取得的 deviceToken
Payload:通知的格式為 JSON,要發送出去的值在 alert 這個 key 輸入即可,法蘭克在這邊輸入 Hello Frank from APNs Tester。欲了解更多的Payload 設定細節可至 Apple Developer 查看相關文件。
Certificate:選擇在步驟 3.2 所產生的 .cer 檔
Gateway:測試環境請選擇 Development
點選 Push 前,務必確認 Mac 和設備是有連接的,並且已在設備上安裝該 App,執行結果如下:
結論:
恭喜大家已完成測試環境的遠程通知實作了,想必也是跟法蘭克一樣經過一番奮戰。倘若是要上架至 App Store 的話,請記得把一些相關的設定再微調過,例如在開發者後台要產生 Production 的 SSL 證書(步驟3.2),還有 Xcode General 下的 Signing(Release) 下選擇佈署正式區的 Provision Profile(步驟6.3) 等等。若在設定上有任何問題都可在問與答中提問。