共用方式為


iOS 中的推播通知

重要

本節中的資訊與 iOS 9 和之前版本有關,這裡已保留支援舊版 iOS 版本。 如需 iOS 10 和更新版本,請參閱 使用者通知架構指南,以支援 iOS 裝置上的本機和遠端通知。

推播通知應保持簡短,且只包含足夠的數據,以通知行動應用程式應該連絡伺服器應用程式以進行更新。 例如,當新的電子郵件送達時,伺服器應用程式只會通知行動應用程式新電子郵件已送達。 通知不會包含新的電子郵件本身。 然後,行動應用程式會在適當時從伺服器擷取新的電子郵件

iOS 中推播通知的核心是 Apple Push Notification Gateway Service(APNS)。 這是 Apple 所提供的服務,負責將通知從應用程式伺服器路由傳送至 iOS 裝置。 下圖說明 iOS 的推播通知拓撲:此映像說明 iOS 的推播通知拓撲

遠端通知本身是符合 iOS 開發人員檔中 本機和推播通知程式設計指南通知承載 一節中指定的格式和通訊協定的 JSON 格式化字串。

Apple 維護兩個 APNS 環境:測試區正式 環境。 沙箱環境是為了在開發階段進行測試,可以在 TCP 連接埠 2195 上的 gateway.sandbox.push.apple.com 找到。 生產環境旨在用於已部署的應用程式,且可在 TCP 連接埠 2195 上的 gateway.push.apple.com 找到。

要求

推播通知必須遵守 APNS 架構所指定的下列規則:

  • 256 位元組訊息限制 - 通知的整個訊息大小不得超過 256 個字節。
  • 沒有回條確認 - APNS 不會向寄件者提供訊息傳達給預定收件者的通知。 如果裝置無法連線並傳送多個循序通知,則除了最近的通知之外,所有通知都會遺失。 只有最新的通知會傳遞至裝置。
  • 每個應用程式都需要安全憑證 - 必須透過SSL與APNS通訊。

建立和使用憑證

上一節所述的每個環境都需要自己的憑證。 本節將說明如何建立憑證、將憑證與布建配置檔產生關聯,然後取得個人資訊交換憑證以搭配 PushSharp 使用。

  1. 若要建立憑證,請移至Apple網站上的iOS布建入口網站,如下列螢幕快照所示(請注意左側的[應用程式標識符] 功能表項):

    Apple 的網站上的 iOS 佈建入口網站

  2. 接下來,流覽至 [應用程式標識符] 區段並建立新的應用程式識別符,如下列螢幕快照所示:

    流覽至 [應用程式識別符] 區段並建立新的應用程式識別碼

  3. 當您按下 [+] 按鈕時,您將能夠輸入應用程式識別碼的描述和套件組合識別碼,如下一個螢幕快照所示:

    輸入應用程式 ID 的描述和組合識別碼

  4. 請務必選取 明確應用程式標識碼,而且套件組合標識元不會以 * 結尾。 這會建立適合多個應用程式的標識碼,而推播通知憑證必須為單一應用程式。

  5. 在 [應用程式服務] 底下,選取 [推播通知]

    選取推播通知

  6. 然後按 提交 以確認新應用程式識別碼的註冊:

    確認新應用程式識別碼的註冊

  7. 接下來,您必須建立應用程式識別碼的憑證。 在左側導覽中,瀏覽至 [憑證] [> 所有],然後選取 [+] 按鈕,如下列螢幕快照所示:

    建立應用程式標識碼的憑證

  8. 選取您是否要使用開發或生產憑證:

    選取開發或生產憑證

  9. 然後選取我們剛才建立的新應用程式識別碼:

    選取剛建立的新應用程式標識碼

  10. 這會顯示指示,引導您完成在 Mac 上使用 Keychain Access 應用程式建立 憑證簽署要求 的程式。

  11. 現在已建立憑證,它必須做為建置程式的一部分來簽署應用程式,以便向APN註冊。 這需要建立及安裝使用憑證的布建配置檔。

  12. 若要建立開發佈建設定檔,請導航至 佈建配置檔 區段,然後使用我們剛才建立的 App ID 來建立設定檔。

  13. 建立布建配置檔之後,請開啟 Xcode 召集人 並重新整理。 如果您建立的布建配置檔未出現,可能需要從iOS布建入口網站下載配置檔,並手動匯入配置檔。 下列螢幕快照顯示已新增配置設定檔的管理者範例:
    此螢幕快照顯示召集人範例,其中已新增布建配置檔

  14. 此時,我們需要將 Xamarin.iOS 專案設定為使用此新建立的佈建描述檔。 這是在 [專案選項] 對話框中的 [iOS 套件簽署] 標籤下完成,如下列螢幕截圖所示:
    將 Xamarin.iOS 專案設定為使用此新建立的布建配置檔

此時,應用程式會設定為使用推播通知。 不過,憑證還需要更多幾個步驟。 此憑證是 DER 格式,與 PushSharp 不相容,而 PushSharp 需要個人資訊交換(PKCS12)憑證。 若要轉換憑證,使其可供 PushSharp 使用,請執行下列最終步驟:

  1. 下載憑證檔案 - 登入 iOS 布建入口網站,選擇 [憑證] 索引標籤,選取與正確布建配置檔相關聯的憑證,然後選擇 [下載]
  2. 開啟金鑰鏈存取 - 這是 OS X 中密碼管理系統的 GUI 介面。
  3. 匯入憑證 - 如果尚未安裝憑證,檔案...從 [金鑰鏈存取] 選單匯入項目。 流覽至上面導出的證書,然後選取它。
  4. 匯出憑證 - 展開憑證,讓相關聯的私鑰可見,以滑鼠右鍵按兩下金鑰,然後選擇 [匯出]。 系統會提示您輸入已匯出檔案的檔名和密碼。

至此,我們已完成憑證的工作。 我們已建立用來簽署 iOS 應用程式的憑證,並將該憑證轉換成可在伺服器應用程式中與 PushSharp 搭配使用的格式。 接下來,讓我們看看 iOS 應用程式如何與 APNS 互動。

向APNS註冊

在iOS應用程式可以接收遠端通知之前,必須先向APNS註冊。 APNS 會產生唯一的裝置令牌,並將其傳回至 iOS 應用程式。 iOS 應用程式接著會取得裝置令牌,然後向應用程式伺服器註冊本身。 一旦發生這種情況,註冊就會完成,而且應用程式伺服器可能會將通知推播至行動裝置。

理論上,每次 iOS 應用程式向 APNS 註冊自己時,裝置令牌可能會變更,但實際上這種情況不會經常發生。 作為優化,應用程式可能會快取最新的裝置令牌,並且只在應用程式伺服器變更時更新。 下圖說明註冊和取得裝置令牌的程式:

下圖說明註冊和取得裝置令牌的程式

APNS 註冊是在應用程式委派類別的 FinishedLaunching 方法中透過對目前的 UIApplication 物件呼叫 RegisterForRemoteNotificationTypes 來處理的。 當 iOS 應用程式向 APNS 註冊時,也必須指定想要接收的遠端通知類型。 這些遠端通知類型是在列舉 UIRemoteNotificationType中宣告的。 下列代碼段是 iOS 應用程式如何註冊以接收遠端警示和徽章通知的範例:

if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
    var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
                       UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                       new NSSet ());

    UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
    UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
    UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}

APNS 註冊要求會在背景發生 - 收到回應時,iOS 會在 AppDelegate 類別中呼叫 方法 RegisteredForRemoteNotifications,並傳遞已註冊的裝置令牌。 令牌會包含在 NSData 物件中。 下列代碼段示範如何擷取 APNS 提供的裝置令牌:

public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
    // Get current device token
    var DeviceToken = deviceToken.Description;
    if (!string.IsNullOrWhiteSpace(DeviceToken)) {
        DeviceToken = DeviceToken.Trim('<').Trim('>');
    }

    // Get previous device token
    var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

    // Has the token changed?
    if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
    {
        //TODO: Put your own logic here to notify your server that the device token has changed/been created!
    }

    // Save new device token
    NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}

如果註冊因為某些原因而失敗(例如裝置未連線到因特網),iOS 會在應用程式委派類別上呼叫 FailedToRegisterForRemoteNotifications。 下列代碼段示範如何向用戶顯示警示,告知他們註冊失敗:

public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
    new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}

裝置令牌管理維護

裝置令牌將會隨著時間到期或變更。 基於這個事實,伺服器應用程式需要進行一些清理作業,並清除這些過期或變更的令牌。 當應用程式以推播通知的形式傳送至具有過期令牌的裝置時,APNS 會記錄並儲存該過期的令牌。 然後伺服器可能會查詢APNS,以找出哪些令牌已過期。

APNS 曾經提供 意見反應服務 - HTTPS 端點,可透過建立的憑證進行驗證,以傳送推播通知,並回傳哪些令牌已過期的資訊。 這已被Apple取代並移除。

相反地,意見反應服務先前回報的案例有新的 HTTP 狀態代碼:

410 - 裝置令牌已對此主題失效。

此外,一個新的 timestamp JSON 資料鍵將會在回應體中出現:

如果 :status 標頭中的值為 410,則此機碼的值是 APN 上次確認裝置令牌對主題無效的時間。

停止推送通知,直到裝置向服務提供者註冊帶有較晚的時間戳記的令牌為止。

總結

本節介紹 iOS 中推播通知的相關重要概念。 它解釋了 Apple 推播通知閘道服務 (APNS) 的角色。 然後,它涵蓋建立和使用APNS不可或缺的安全性憑證。 最後,本檔已討論應用程式伺服器如何使用 意見反應服務 來停止追蹤過期的裝置令牌。