作者:Gabriel Theodoropoulos,原文鏈接,原文日期:2016-01-27
譯者:bestswifter;校對:Channe;定稿:numbbbbb
“推送通知?喔,不!”。是的,這就是我被叫去實現一個 iOS 應用中的推送通知功能時,腦海中閃過的第一念頭,而且我相信你們也曾經有過這樣的想法。這不是因為推送通知很難使用,而是在能夠測試推送一條單獨的通知前有很多步操作需要完成,這些操作步驟最終幾乎把所有開發者弄得暈頭轉向。不過我們再堅持一會兒,從頭開始把事情想明白。
在應用不在運行時,我們經常需要把用戶的注意力吸引過來。正如我們所知道的那樣,這可以通過 通知 實現。作為一名 iOS 開發者,你應該知道 iOS 支持兩種類型的通知:本地通知和推送通知(或者叫遠程通知)。在之前的例子中,通知由應用自己 注冊 并 管理,這種通知很容易實現。事實上,你可以在這里和這里找到一些先前介紹本地通知的教程。
推送通知不是由應用自己預先計劃的。它們由另外一個服務(叫做 Provider)觸發,通常情況下是 web 服務器,這些通知往往同時發往多個設備。有了推送通知,應用開發者可以在需要的時候給用戶發送消息,消息既可以在隨機的時間點被發送,也可以按計劃時間發送,消息主體可以是默認的或自定義的。維基百科頁面是一份很好的資源,它提供了一些關于蘋果推送通知的基本信息。
每一個推送通知由 provider 經過一條強制指定的路徑發往一個或多個目標設備。這條路徑必須經過 Apple Push Notification Servers,或者簡稱 APN servers。實際上,這些服務器會為推送通知規劃路徑,從而發往正確的設備。通常情況下,消息在由 provider 發送給服務器的幾秒鐘內,被服務器投遞給目標設備。簡而言之,遠程通知的生命周期可以總結如下:
Provider >> APN servers >> 目標設備
我建議你查閱官方文檔,文檔中有很多有用的細節,介紹了推送通知的工作原理。
在應用可以收到推送通知之前有幾步配置工作,這些步驟總體上可以被分為兩步:編程方面的準備和創建各種證書、描述文件(provisioning profile)等。編程部分很容易,它只是幾段必須添加到項目中的標準代碼。容易引起混淆的是第二步,這些操作需要在不同的地方被執行,比如 Mac 上的鑰匙串訪問程序,Xcode 項目和 Apple Developer Member Center 網站。
除此以外,遠程通知可以被分為兩種,一種是 沙盒 通知,這種通知可以在開發階段使用,因此它可以用于調試。另一種是 實時 通知,這意味著它只能在產品發布階段使用。如果你成功的在應用中接收到了沙盒通知,并且正確的執行了此前提到的各種操作,那么就可以放心的認為實時推送通知也可以正常使用了。毫無疑問,Apple 為發送沙盒通知提供了專門的測試服務器,這并不是由生產環境下的 APN 服務器負責的。
這篇教程的目的很簡單:我們希望為一個 demo 應用實現推送通知功能,并發送一些沙盒通知以確保通知推送功能正常運行。希望下次你為應用添加推送通知功能時,這篇教程能幫上你。最重要的是,實現推送通知功能事先需要各種繁瑣的配置,這篇教程可以指引你走出這種困境。
關于 Demo 應用
在正式開始一篇教程之前,我總是會給出一些信息,介紹將要實現的 demo 應用。我經常會提供一個初始項目,不過這次不會。
要想創建這篇教程的 demo,你只需要在 Xcode 中創建一個新的 iOS 項目就可以了。你不需要額外添加任何內容或控制,因為這個項目并非用來測試應用內的功能,它只是作為一個通知推送的目標。
你可以隨便給項目起個名字,比如我把它命名為 PNDemo。
所以在這一步中,我們創建了一個新的 iOS 項目,我們繼續接下來的步驟。
重要提醒:
在開始講解這篇教程的細節概念之前,我必須說明清楚,基于某些會遇到的情況,我做了一些假設。我們約定:
- 你有一個付費的開發者賬戶,或者至少能夠獲取一個這樣的賬戶。
- 在 Apple Developer Member Center 網站中已經至少有一個 iOS Development Certificate,否則你可以看一看這篇文章,如果你需要使用 Code Signing Request (CSR) 文件,請閱讀下一部分內容來學習如何創建它。
- 你明白我在這篇文章中所說的推送消息僅僅是指 Apple 公司的推送消息。
- 你明白當我說“蘋果開發者網站”時,我其實指的是“Apple Developer Member Center”網站。
- 你知道通知的載荷(payload)是什么(內容、角標、聲音以及其他數據),并且知道如何處理它們。查看這篇文章可以復習關于通知的知識。
步驟一:證書簽名請求文件
既然你已經創建好了 demo 項目,那么暫時先把它擱置一會兒,準備進行整個流程的第一步。我們的目標是創建一個 Certificate Signing Request (CSR) 文件,這個文件稍后將被用于創建推送通知的 SSL 證書。
在這一步中,你需要使用 Mac 上的 鑰匙串訪問 應用。你可以使用 Launchpad 或 Spotlight 來找到并打開這個應用。如果你不熟悉這個應用,不要無意中刪除任何已有的文件。
打開 鑰匙串訪問 應用后,如下圖所示,依次打開這些菜單 鑰匙串訪問 > 證書助理 > 從證書頒發機構請求證書,如下圖所示:
在打開的窗口中,你必須填寫 User Email Address 和 Common Name。除此以外,還需要選中 Saved to disk 選項,這樣你可以把文件保存到磁盤中,這個文件稍后在蘋果開發者網站上會用到。
點擊 Continue ,你可以選擇這個 CSR 文件的文件名和存儲位置。我把這個教程中創建的所有文件都保存在一個新建的文件夾中(文件夾的名字是 PNDemo Files,我希望你也這么做),CSR 文件名使用的是默認的文件名。
當你看到一條消息,提示你的證書請求文件已經被創建時,點擊 完成 按鈕,然后你就…完成了。我們剛剛申請并保存的這個證書將被用于在蘋果開發者網站上為其他證書簽名。
步驟二: 創建一個 App ID
我們的下一步操作是在蘋果開發者網站上創建一個新的 App ID。這個 App ID 是將你的應用和其他應用區分開來的唯一標志,它可以幫助 APN 服務器正確的規劃發送通知的路徑。實際上,你將會看到我們會把這個 App ID 和其它幾樣東西關聯起來:一個用于推送通知的新證書,一個允許我們在測試設備上運行應用的描述文件。
先完成最重要的事,我們前往 Apple Developer Member Center,輸入用戶名密碼后登陸。然后點擊 Certificates, Identifiers & Profiles 鏈接,于是你會跳轉到合適的頁面。
進入到新的頁面后,點擊 iOS Apps 那一節中的 Identifiers 鏈接。
你會看到 App IDs 選項是事先就選中的(在左側菜單的 Identifiers 目錄中),在主窗口中列出了所有已存在的 App ID 。我們新創建的 App ID 也會被添加到這個列表中,不過首先得點擊右上角的加號按鈕。
現在,我們要為 demo 創建一個新的 App ID,對新手來說,我們需要填寫兩部分內容:
- 新 App ID 的描述介紹。在這個例子中,你輸入的內容并不是很重要,不過最好還是要做到語言清晰,具有實際意義。
- 應用的 Bundle ID,你可以直接從 Xcode 項目中復制并粘貼到這里。
你會發現,在這兩個值之間還有一個需要設置的值,它叫做 App ID Prefix。通常情況下,你不需要修改這里的默認值,但是如果你確實需要選擇一個不同的前綴,也別猶豫。在這篇教程中,我選擇使用默認值。
在這一步中,你要記住一個很重要的細節:實現通知推送功能需要選擇 explicit App ID,因為這個 App ID 必須匹配某個具體的 Bundle ID。在這種情況下,蘋果不允許我們使用通配的 App ID(以星號 * 結尾的 App ID)。無論應用具有怎樣的特點,我個人總是認為使用 explicit App ID 比通配 App ID 更好。這樣會讓你在 App ID 列表中,很清楚的區分開每一個 App ID。
設置好以上內容后,向下滾動網頁到 App Services 區域。在所有提供的服務的底部,勾選 Push Notifications 選項,在你開始下一個操作前務必反復檢查,確保這個選項確實已經被選中。
接下來,點擊 Continue 按鈕并等待確認頁面出現。檢查所有的信息是否都正確無誤,然后點擊 Submit 按鈕提交信息。如果你檢查到錯誤,可以回退到前面的頁面,修改任何一個有錯的值。
在最后一步中,你會看到 Registration Complete 頁面,只要點擊 Done 按鈕即可,你會看到新的 App ID 已經被添加到 App ID 列表中。
步驟三:配置推送通知的 App ID
注意到沒有,盡管此前在創建 App ID 時我們勾選了 Push Notifications 服務,但是它在 Development 和 Distribution 模式下都被標記為 Configurable 而不是 Enabled。這說明我們還需要進行一些額外的操作,將通知推送服務切換到合適的狀態。
在這個教程中,我們不會在生產環境中測試推送任何通知,也就是完全不涉及 Distribution 模式。出于這一點考慮,我們只會配置 Development 模式下的推送通知。不過接下來的操作對于 Distribution 模式下的配置完全適用。在一個實際的應用中,你顯然需要配置 Distribution 模式,否則在應用上架 App Store 后,推送通知的功能就會失效。
現在,我們點擊列表中剛剛創建的 App ID,在展開的服務列表中,點擊 Edit 按鈕進行下一步操作。
向下滑動到 Push Notifications 一節,你會發現兩個按鈕,分別用于創建開發環境和生產環境下的 SSL 證書。因為我們只關心 Development 模式,所以點擊下圖中的第一個按鈕:
“很久”以前通過鑰匙串訪問創建的 Certificate Signing Request 文件是時候登場亮相了。接下來,我們首先點擊 Continue 按鈕。如果你還沒有創建 CSR 文件,這幾條教程會教你如何創建它。
接下來,點擊 Choose File… 按鈕并找到你在第一步中創建的 CSR 文件。如果你沒有修改文件的默認名字,那么你要找的文件的名字就是 CertificateSigningRequest.certSigningRequest
。
最后,點擊藍色的 Generate 按鈕,如下圖所示:
棒!你已經成功創建了一個新的證書,它可以在 development(sandbox)模式下推送通知。現在你需要把它下載下來,然后添加到鑰匙串(Mac 上的鑰匙串訪問應用) 中,所以接下來你需要點擊 Download 按鈕。
你剛剛下載的文件名是 aps_development.cer
。在 Downloads 文件夾中找到它,雙擊打開這個證書并將它添加到 Keychain Access 的證書列表中。
重要提醒: 雙擊打開 .cer 文件并將它添加到鑰匙串訪問中時,請確保它被添加到登錄而不是系統或其他鑰匙串中。如果加入的鑰匙串有錯,你只需要把證書拖動到登錄鑰匙串中即可。這對下一步操作很重要。
把證書添加到 KeyChain 中后,右鍵點擊這個證書,然后選擇 Export “…” 選項
導出格式要選擇成 .p12 文件,然后點擊 Save 按鈕。
如果你不想設置密碼,可以直接點擊 OK 按鈕跳過這一步。如果你設置了密碼,那么就要記住它或者把它寫在某個地方,否則一旦忘記了密碼,這個文件也就沒用了。
在這個教程中,我們不會用到這個導出的文件。但如果你想在遠程服務器上(比如 Parse)測試推送通知功能,你就需要在推送第一條通知以前提供 .p12 格式的文件。所以目前你把這個 .p12 文件和其他文件一起保存著就好。這一步的關鍵在于你能夠意識到開發模式下創建 .p12 文件的方法同樣適用于生產環境。
步驟四:注冊設備
首先,我需要說明這一步僅對測試沙盒模式的推送通知有用,在實際的生產環境下不需要這一步。現在,我們去蘋果開發者網站上注冊用于測試的設備,如果你曾經注冊過設備,也就是列表中可以找到這個設備,那么你可以跳過這一步。
假設你現在是第一次添加設備,首先你需要將物理設備與 Mac 連接,然后在 Xcode 中打開 Window > Devices 菜單,在打開的窗口中列出了所有的物理設備和模擬器。
在左側選擇你的設備,你會在主窗口中看到更多細節。注意到其中有一項是 Identifier,它的值是一長串數字和字母,雙擊選中這個值并復制。
現在,返回蘋果開發者網站,點擊 Devices 目錄下的 All 選項,所有被注冊過的設備都顯示在主窗口中。要想新增一個設備,你需要點擊右上角帶有加號(+)圖標的按鈕。
在新打開的表格中,首先在 Name 文本框中輸入設備名稱(比如 Gabriel’s iPhone 6S 或 My lovely iPad)。然后把之前復制的設備的 identifier 填寫在 UUID 文本框中,這一步就完成了。
點擊 Continue 按鈕,在下一步中需要確認所以填寫的信息都準確無誤。搞定以上這些后,點擊 Register 按鈕完成注冊。
你可以驗證是否成功的注冊了設備,只要再次點擊 Devices 目錄下的 All 選項,然后逐條查找你剛剛輸入的設備名即可。
步驟五:創建開發環境的描述文件
在蘋果開發者網站上的最后一個任務是為開發環境創建一個描述文件。它將會用于為應用提供代碼簽名。注意,在把應用上傳到 iTunes Connect 并使用 TestFlight 或上架 App Store 之前,你需要創建發布環境的描述文件(Distribution provisioning profile)。它的使用方法和你將要學到的開發環境的描述文件的使用方法類似。
在蘋果開發者網頁上,點擊 Provisioning Profiles 目錄下的 Development 鏈接,主窗口中會顯示出所有已存在的描述文件。稍后,我們新建的描述文件也會添加到這里。
你可以通過點擊右上角的加號(+)按鈕創建一個新的描述文件。在新打開的表格中,點擊選擇 iOS App Development選項(第一個選項)。注意,如果你創建的是用于發布應用的描述文件,就應該選擇底下第二個區域中的選項(很大可能是 App Store)。
選擇了合適的選項后,點擊 Continue 按鈕開始下一步操作。
現在,我們要把這個描述文件與應用對應的 App ID 關聯起來。你需要在下拉菜單中查找并選擇正確的 App ID。
接下來,你需要把你的 iOS Development certificate 導入到描述文件中(假設你至少有一個證書)。如果像下圖所示那樣,有多個證書并且不確定該選擇哪一個,一種簡單的方法是勾選 Select All 選項導入所有的證書,這一步就完成了。
接下來是選擇將要運行應用的設備,請確保沒有漏選任何用于測試推送通知的設備。選擇好后再次點擊 Continue 按鈕。
最后一步是為描述文件文件命名,將它與其他文件區分開來。我把它叫做 PNDemo Development Profile,你可以根據自己的喜好隨便起名。
點擊 Generate 按鈕并等待下一個頁面出現。當新的描述文件創建完成后,你就可以下載它了。如下圖所示:
你只需要根據以上這些圖片的指示去操作即可,然后雙擊打開并安裝剛剛下載的文件。如果你按照我的方式命名,那么你的文件名會是 PNDemo_Development_Profile.mobileprovision。
步驟六:配置項目
從這一步開始,我們就和蘋果開發者網站說再見了。把目光轉移到我們的項目上來,這里我們需要完成兩個任務:
首先我們要在項目中開啟推送通知功能,這樣設備才能接收到通知。雖然這是很基礎,很簡單的一步,但是相信我,很多開發者都會忘記啟用推送通知功能。
我們需要正確設置應用的 code signing 和 provisioning profiles。注意,接下來的操作都會在 Development 模式下進行,我們完全不會涉及生產環境。但是這兩者非常類似,所以在應用上線前你可以仿照這里的步驟完成生產環境下的配置。
在 Xcode 中打開應用,選擇 Project 導航欄中的項目。請確保你處于 General 標簽下,然后點擊 Team 下拉控件,選擇正確的 team。
如果你的 Team 列表空空如也,那么你得前往 Xcode > Preferences… 菜單,在 Accounts 標簽下新增一個 Apple ID。你需要輸入正確的用戶名和密碼并點擊 Add 按鈕完成添加。這一步的細節已經超出了本教程的探討范圍,因此如果你拿不準怎么做,這個鏈接中的文章會一步一步指導你。成功添加 Apple ID后,關閉偏好窗口并返回 General 標簽,選擇合適的 Team。
接下來,點擊 Capabilities 標簽,找到 Push Notifications 這一節,你只需要打開開關即可。
正如截圖中的信息所示,一旦啟用推送通知功能,在 Info.plist 文件中就會自動添加相應的權限。
現在打開 Build Settings 標簽,找到 Code Signing 這一節。展開 Provisioning Profile 字段,然后點擊 Debug 這一行中的 Automatic。在展開的列表中有你的開發者賬戶下所有的描述文件,你需要選擇你上一步下載并安裝的那一個。
因為我們沒有創建發布應用時用到的描述文件,所以我們無需設置 Release 這一行中的值。不過當你在蘋果開發者網站上創建并下載發布應用時用到的描述文件后,你需要采取與這里相同的操作。
你可以在描述文件字段上面找到 Code Signing Identity 字段。如果它沒有展開,你可以點擊左側的箭頭展開它。這一步的操作和剛才類似,點擊 Debug 欄中的默認值 iOS Developer (或 iPhone Developer),然后在彈出的列表中選擇合適的身份證明。如下圖所示:
在實際應用中,別忘了在 Release 欄中設置 Distribution 模式下的身份證明。
現在,點擊 General 標簽左側的 Target 選項,選擇 Project:
找到 Code Signing 這一節,重復之前的步驟。首先選擇 Debug 模式下的描述文件,然后設置好正確的 Code Signing Identity。
步驟七:注冊推送通知
到目前為止,項目中的配置都結束了,現在我們需要寫幾行代碼了。首先,我們讓應用自身向 iOS 系統注冊接收推送通知,并指定我們希望接受的通知的類型(比如角標,聲音或警告信息)。
事實上,我們會用到上述所有類型的通知,這也是我們的在這一步的切入點。打開 AppDelegate.swift
文件,在 application(_:didFinishLaunchingWithOptions:)
方法的 return true
前面添加下面兩行代碼:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let notificationTypes: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]
let pushNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
return true
}
我們首先指定應用中會用到的通知類型,然后創建一個 UIUserNotificationSettings
類型的對象。我們使用這個對象向系統注冊推送通知。如果出于某些原因,你不想使用上面這個數組中所有種類的通知,只要刪除掉不想要的即可。
現在,我們將這些可能用到的推送通知的類型告知系統,并且注冊接收推送通知:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
application.registerUserNotificationSettings(pushNotificationSettings)
application.registerForRemoteNotifications()
return true
}
盡管以上幾行代碼都很重要,但最后一行才是設備能夠接收推送通知的關鍵。這一部分中添加的四行代碼是一段標準代碼,所以你幾乎可以把它們用在你的所有項目中。我是說幾乎,因為總會有需要修改通知類型的時候。
步驟八:代理方法
注冊推送通知是很關鍵的一步,但這只是我們要做的編程工作的一半。另外一些與編程有關的任務是實現一些代理方法,這樣你的應用才能在接收到通知時做出正確響應。我們一個個看這些方法:
首先,我們要實現 application(_: didRegisterForRemoteNotificationsWithDeviceToken:)
方法。它在應用成功注冊推送通知后調用。通常情況下,第二個參數至關重要,它包含了每個設備獨有的一個 key,我們把這個 key 稱為 device token。在實際使用中,你需要把 device token 發送給服務器。這里的服務器是推送消息的最初發起方,它把 device token 和其他必要信息發送給 APN 服務器。這就是為什么 APN 服務器能夠知道通知的接收者是哪臺設備。
Device token 的格式是這樣的:< XXXX XXXX XXXX XXXX XXXX >。通常情況下,在發送給服務器之前,你需要對它進行一些格式轉換,比如移除 “<" 和 ">”字符或者移除字符串中間的空格。不過最終始終何種格式還是取決于服務器如何處理 device token。一些服務提供商會為你提供框架,以便你集成并處理推送消息(如 Parse),如果你打算使用他們的解決方案,那么框架的使用指南會告訴你如何實現格式轉換。
不管怎么說,由于我們在本篇教程中不會使用真正的服務器,你只需要了解以上知識并在實際的應用中進行正確操作即可。目前我們只打算把 device token 輸出到控制臺中。我們需要知道它的值,這樣待會兒才能測試推送通知。下面是我們的實現代碼:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
print("DEVICE TOKEN = \(deviceToken)")
}
我們不能確保注冊推送通知一定是成功的,這個過程可能因為多種原因而失敗。所以,實現下面這個方法也很重要,在這個方法中我們可以處理注冊失敗的情況:
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
print(error)
}
當然,你需要根據應用的邏輯或需求來進行適當的錯誤處理。
正如你所知,當應用不在前臺運行時,推送通知會出現在設備上。但很多時候,應用會在運行時收到推送通知。在這種情況下,作為一名開發者,你需要用適當的方法處理接收到的通知。在 demo 中,我們只是把收到的信息輸出到控制臺里。但在實際的應用中,你絕對不應該這么做。
下面是對應的代理方法的實現:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
print(userInfo)
}
你還可以根據應用的具體需求,使用更多的代理方法,不過這就不是本文所討論的內容了。UIApplicationDelegate 協議的文檔可以參考這個鏈接,你可以從中找到更多有關遠程通知的方法。考慮到這篇教程的目的是指導你實現推送通知的功能,了解以上三個代理方法就足夠了。
步驟九:沙盒模式下推送通知
測試推送通知曾經是一件很麻煩的事,因為這只有一種解決方案。要么從頭開始寫一個命令行腳本,要么找一份已有的腳本并根據自己的應用和設備進行修改。時至今日,這個方案依然行得通,但在 Mac App Store 上已經出現了一些專門用于測試推送通知的應用。沒錯,這就是我們將要使用的方案。
使用 Mac 上的應用來測試推送通知的好處在于,它提供了用戶界面(GUI)給我們填寫必要的數據(比如 device token 或推送通知的證書)。而且這些應用隱藏了“無聊”的編程部分,比如連接到 APN 服務器。實際上,在大多數此類應用中,你只需要指定以下三樣東西:
- 用于接收測試通知的目標設備的 device token;
- 推送通知證書的保存路徑;
- 推送通知的載荷(消息、角標數字和聲音)。
在這個部分中,我會向大家展示兩款應用。不過首先要澄清的是:此舉完全不是為了推廣這些應用。你即將看到的這兩款應用,以及 Mac App Store 上其他同類的應用,在我看來是都是可以簡化工作、節省時間的簡單的工具。基于以上邏輯,我們繼續這篇教程,來看看如何成功的推送第一條通知。
第一個要推薦的應用叫 APN Tester Free,你可以在這里找到它。這是一個免費下載的應用,借助這個應用你可以快速的測試推送通知。
如上圖所示,你需要把 device token 復制到 Device Token 文本框中(不帶“<"和">”字符)。你只要運行一次 demo 就可以很容易地在控制臺中看到 device token。你應該會看到如下圖所示的結果:
首次運行應用時,系統會詢問你是否允許接收遠程通知。顯然,如果你想要測試接收通知就必須選擇允許。
在 Payload 文本框中,你需要填寫推送通知的細節內容。比如你希望接收一條消息,顯示角標數字并播放默認的聲音,你應該這樣寫:
{"aps":{"alert":"Hello from AppCoda!","badge":1, "sound": "default"}}
若想獲取更多有關通知載荷和所有可設置的值的信息,請訪問官方文檔。
在填寫正確的 Certificate 信息時,你需要點擊 Browse 按鈕,在磁盤中查找開發模式下的推送通知證書(這顯然是在 Gateway 的值被設置為 Development 時的操作)。提醒你一下,這個證書的名字應該是 aps_development.cer(除非你修改了文件名)。找到證書并導入到應用中后,你會在控制臺中看到一條消息,告訴你 .cer 文件已經被成功的加載了。
設置完以上內容后,你就已經準備就緒,可以推送通知了,你要做的僅僅是點擊 Push 按鈕。這時你會在應用的控制臺中看到推送通知被發送的消息,如果推送失敗,控制臺中同樣會有紅色的文字提示。
如果你按照教程,一步一步的進行操作并且沒有漏掉任何步驟,那么你將會收到第一條推送通知
你完全可以反復發送通知,這樣你可以看到在設備鎖屏時、打開通知中心時、甚至是應用運行時等不同情況下,通知是如何出現的。如果在應用運行時收到通知,你會在 Xcode 的控制臺中看到如下輸出:
除此以外,你還可以自己修改角標數字,開啟或關閉通知的聲音。通過這些嘗試,你可以確保所有的配置都正確無誤。
另一個我打算向你展示的應用是一個叫做 Easy APNs Provider 的程序,你可以在這里找到它。這是一個免費應用,它有一些額外的選項可供設置,因此你可以嘗試設置推送通知更加高級的功能(比如額外的數據)。
使用這個應用時,首先點擊 Add tokens… 按鈕并把 device token 添加到應用中。在彈出的模態視圖中,把 token 復制到第一個文本框中,同時務必確保你已經刪掉了“<"、">”字符和空格。如果格式有誤,token 就無法被添加到應用中。完成這一步后點擊 Add 按鈕,你會看到 device token 已經被添加到窗口的底部。你還可以選擇點擊 token 的左側,為它起一個名字,然后點擊 Confirm 按鈕完成。
接下來,點擊 2. Choose Certificate file按鈕,再次找到 aps_development.cer 文件并把它導入到應用中。成功導入后你會在按鈕的旁邊看到證書文件的名字。
確保右下方的下拉控件中被選中的值是:gateway.sandbox.push.apple.com,然后點擊 3. Connect to:按鈕。在顯示狀態的文本框中,你會看到應用已經成功的連接上了 APN 服務器。
現在是時候準備推送通知的載荷了,我們把目光轉移到應用窗口的右上角,選擇你想測試的選項。為了最好的演示通知效果,你可以選擇 Content,badge 和 sound 選項。然后在下面的表格中填寫 title,content 和 badge 的值,這里的值可以隨意設置。如果你想看到載荷的原始模式(JSON 模式),可以點擊 Raw 標簽,否則就使用當前這種更容易處理的模式。
最后,點擊 5. Send APN 按鈕來發送通知,幾秒鐘內你的設備就會接收到這個通知。
正如我在這一步開始的時候所說,你并非只能選擇以上這兩個工具。你可以去 Mac App Store 中找找其他的軟件,它們或許能夠更好的實現你的需求。
總結
在這篇教程中,我們經歷了很多步驟,執行了許多不同的操作。如果你讀到了這里,并且成功的在沙盒模式下推送了通知,那么你完全有理由相信在實際應用中,實時通知推送也會正常工作。你只需要遵循文中列出的操作指南,將它們應用于 Distribution 模式并且補上文中沒有處理的部分即可。舉個例子吧,你需要編輯你的 App ID 并創建發布應用時用到的 SSL 證書,還需要創建 Distribution 模式下的描述文件,當然還得在項目的 Build Settings 中使用合適的代碼簽名。無論如何,我都希望本文能夠幫助你理清思路,弄清楚配置通知推送的步驟,最終幫助你更快的完成任務。下回再見!
本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問 http://swift.gg。