在 iOS 應用程式中新增推播通知

1. 簡介

上次更新時間:2020 年 1 月 6 日

Firebase 雲端通訊 (FCM) 是跨平台的訊息傳遞解決方案,可讓您免費安全地傳送訊息。

使用 FCM,您可以通知用戶端應用程式有新的電子郵件或其他資料可供同步處理。您可以傳送通知訊息,提高使用者回訪率和留存率。如果是即時通訊等用途,訊息最多可將 4 KB 的酬載傳輸至用戶端應用程式。

運作方式

實作 FCM 時,必須包含兩個主要元件,才能傳送及接收訊息:

  1. 可建構、指定及傳送訊息的信任環境,例如 Cloud Functions for Firebase 或應用程式伺服器。
  2. iOS、Android 或網頁 (JavaScript) 用戶端應用程式,透過相應的平台專屬傳輸服務接收訊息。

FCM 架構總覽

dc54f5190ee8926a.png

FCM 依賴下列元件集來建構、傳輸及接收訊息:

  1. 用於撰寫或建構訊息要求的工具。通知編輯器提供以 GUI 為基礎的選項,可建立通知要求。如要全面自動化並支援所有訊息類型,您必須在支援 Firebase Admin SDK 或 FCM 伺服器通訊協定的可信伺服器環境中,建構訊息要求。這個環境可以是 Cloud Functions for Firebase、Google App Engine 或您自己的應用程式伺服器。
  2. FCM 後端 (除了其他函式外) 會接受訊息要求、透過主題執行訊息扇出,並產生訊息中繼資料,例如訊息 ID。
  3. 平台層級的傳輸層,負責將訊息傳送至目標裝置、處理訊息傳送作業,並視需要套用平台專屬設定。這個傳輸層包括:
  • 適用於搭載 Google Play 服務的 Android 裝置的 Android 傳輸層 (ATL)
  • iOS 裝置的 Apple 推播通知服務 (APNs)
  • 網頁應用程式的網路推播通訊協定
  1. 使用者裝置上的 FCM SDK,會根據應用程式的前景/背景狀態和任何相關應用程式邏輯,顯示通知或處理訊息。

建構項目

在本程式碼研究室中,您將使用 FCM 在 iOS 範例應用程式中新增推播通知。

課程內容

  • 如何訂閱及取消訂閱使用者的推播訊息
  • 如何處理收到的推播訊息
  • 如何顯示通知
  • 如何回應通知點擊

軟硬體需求

  • Xcode 11.0 以上版本
  • CocoaPods 1.9.0 以上版本
  • Apple 開發人員帳戶
  • 用於執行應用程式的實體 iOS 裝置
  • 對 Swift 有基本瞭解

2. 開始設定

下載範例程式碼

在本程式碼研究室中,您將建構自己的測試應用程式,但如果您想查看及執行現有的範例應用程式,可以下載快速入門範例程式碼。

取得樣本的方法有兩種:

  • 複製 Git 存放區:
$ git clone https://github.com/firebase/quickstart-ios.git
  • 下載 ZIP 檔案:

如果將來源下載為 ZIP 檔案,解壓縮後會得到根資料夾 quickstart-ios

建立新應用程式

請按照下列步驟建立自己的測試應用程式 (以下步驟適用於 Xcode 12.3):

  1. 開啟 Xcode,然後選取「Create a new Xcode project」
  2. 選取「應用程式」,然後點選「下一步」

d6a3fc16ba7d4f72.png

  1. 輸入「產品名稱」 (例如 MessagingExample)
  2. 選取「團隊」 (如果尚未建立團隊,請在 Apple 開發人員帳戶中設定)。
  3. 輸入機構 ID (例如 com.your-name)
  4. 輸入套件 ID (例如 com.your-name.MessagingExample,且在所有 iOS 應用程式中不得重複。
  5. 在「介面」下拉式選單中選取「分鏡腳本」
  6. 在「生命週期」下拉式選單中選取「UIKit 應用程式委派」
  7. 在「語言」中選取「Swift」
  8. 點選 [下一步]。

a07d72459f65dcc1.png

建立 APN 金鑰並向 Firebase 專案註冊應用程式時,您需要套件 ID。

3. 設定 APN

建立驗證金鑰

本節說明如何為已啟用推播通知的應用程式 ID 產生驗證金鑰。如果您有現有金鑰,可以使用該金鑰,不必產生新金鑰。

如何建立驗證金鑰:

  1. 在開發人員帳戶中,前往「Certificates, Identifiers & Profiles」(憑證、ID 與設定檔),然後前往「Keys」(金鑰)

708ac6e36366b11f.png

  1. 按一下右上角的「新增」按鈕 (+)。

e71849c7e6e4e714.png

  1. 輸入 APN 驗證金鑰的說明
  2. 在「金鑰服務」下方,選取 APNs 核取方塊,然後按一下「繼續」

65c9930dc2d8bf1c.png

  1. 按一下「註冊」,然後按一下「下載」。將金鑰存放在安全的地方,這是一次性下載,金鑰無法在之後擷取。

bda45effb420b7c2.png

建立應用程式 ID

應用程式 ID 是應用程式的專屬 ID,通常以反向網域表示。

  1. 前往 Apple 開發人員會員中心並登入。
  2. 前往「憑證、ID 和設定檔」
  3. 前往「ID」
  4. 按一下「+」按鈕,建立新的應用程式 ID。2a325a323b652124.png
  5. 選取「應用程式 ID」單選按鈕,然後按一下「繼續」

fb24e3374de047a3.png

  1. 選取「應用程式」,然後按一下「繼續」

cca5eb32736f947.png

  1. 如要建立新的應用程式 ID,請按照下列步驟操作:
  2. 輸入應用程式 ID 的名稱
  3. 輸入團隊 ID。這個值必須與「會員」分頁中的「團隊 ID」相符。
  4. 在「應用程式 ID 後置字元」部分中選取「明確的應用程式 ID」,然後輸入「軟體包 ID」7363c4d1962b486d.png
  5. 在「應用程式服務」部分中,確認已勾選「推播通知」8e158017bc31fd46.png
  6. 按一下「繼續」,並確認輸入內容正確無誤:
  7. 「ID」的值應與團隊 ID 和軟體包 ID 的值串連相符
  8. 推播通知應為可設定
  9. 按一下「Register」即可建立應用程式 ID。

建立設定檔

如要在開發期間測試應用程式,您需要開發用設定檔,授權裝置執行尚未在 App Store 發布的應用程式。

  1. 前往 Apple 開發人員會員中心並登入。
  2. 前往「憑證、ID 和設定檔」
  3. 如果尚未選取左上角下拉式選單中的「iOS、tvOS、watchOS」,請先選取,然後前往「Profiles」
  4. 按一下「+」按鈕,建立新的設定檔。100604ffceac6a1d.png
  5. 選取「iOS App Development」做為佈建設定檔類型,然後按一下「繼續」

7d4d20883a4c4142.png

  1. 在下拉式選單中選取要使用的應用程式 ID,然後按一下「繼續」
  2. 選取上一步所選應用程式 ID 的 iOS 開發憑證,然後按一下「繼續」
  3. 選取要納入佈建設定檔的 iOS 裝置,然後按一下「繼續」。請務必選取所有要用於測試的裝置。
  4. 輸入這個佈建設定檔的名稱 (例如「MessagingExampleProfile」MessagingExampleProfile),然後按一下「Generate」

7346087f5a0179f2.png

  1. 按一下「下載」,將佈建設定檔儲存到 Mac。

548c8c27f3ce5bca.png

  1. 按兩下「Provisioning Profile」檔案進行安裝。

4. 將 Firebase 新增至 iOS 專案

建立 Firebase 專案

將 Firebase 加入 iOS 應用程式前,請先建立要連結至該 iOS 應用程式的 Firebase 專案。如要進一步瞭解 Firebase 專案,請參閱「瞭解 Firebase 專案」一文。

  1. 在 Firebase 控制台中,按一下「新增專案」,然後選取或輸入「專案名稱」caf43df5174a530e.png

如果您有現成的 Google Cloud Platform (GCP) 專案,可以從下拉式選單中選取專案,將 Firebase 資源新增至該專案。

  1. (選用) 如果要建立新專案,可以編輯「專案 ID」

Firebase 會自動為 Firebase 專案指派專屬 ID。請參閱「瞭解 Firebase 專案」,進一步瞭解 Firebase 如何使用專案 ID。

  1. 按一下「繼續」
  2. 為專案設定 Google Analytics,即可在下列 Firebase 產品中獲得最佳體驗:
  • Firebase Crashlytics
  • Firebase 預測
  • Firebase 雲端通訊
  • Firebase 應用程式內通訊
  • Firebase 遠端設定
  • Firebase A/B 測試

系統提示時,請選取使用現有的 Google Analytics 帳戶,或建立新帳戶。如果選擇建立新帳戶,請選取 Analytics 報表位置,然後接受專案的資料共用設定和 Google Analytics 條款。

ffbcd801d08078b2.png

473c89d0a404f066.png

  1. 按一下「建立專案」 (如果您使用現有的 GCP 專案,請按一下「新增 Firebase」)。

Firebase 會自動為 Firebase 專案佈建資源。程序完成後,系統會將您帶往 Firebase 主控台的 Firebase 專案總覽頁面。

向 Firebase 註冊應用程式

建立 Firebase 專案後,你可以加入 iOS 應用程式。

如要進一步瞭解將應用程式新增至 Firebase 專案的最佳做法和注意事項,包括如何處理多個建構變體,請參閱「瞭解 Firebase 專案」。

  1. 前往 Firebase 主控台。
  2. 在專案總覽頁面中間,按一下 iOS 圖示來啟動設定工作流程。

如果已將應用程式新增至 Firebase 專案,請按一下「新增應用程式」顯示平台選項。

549e710c09b601ea.png

  1. 在「iOS 軟體包 ID」欄位中輸入應用程式的軟體包 ID。
  2. (選用) 輸入其他應用程式資訊:應用程式暱稱App Store ID
  3. 按一下 [Register app] (註冊應用程式)

7a2bd11d13365c.png

新增 Firebase 設定檔

  1. 按一下「Download GoogleService-Info.plist」(下載 GoogleService-Info.plist),取得 Firebase iOS 設定檔 (GoogleService-Info.plist)。625594126a8943bf.png
  2. 將設定檔移至 Xcode 專案的根目錄。系統出現提示時,請選取將設定檔新增至所有目標。

aa100af06c7a74e5.png

如果專案中有多個軟體包 ID,您必須將每個軟體包 ID 與 Firebase 控制台中的已註冊應用程式建立關聯,這樣每個應用程式才能擁有專屬的 GoogleService-Info.plist 檔案。

關閉 XCode。

在應用程式中新增 Firebase SDK

建議使用 CocoaPods 安裝 Firebase 程式庫。不過,如果您不想使用 CocoaPods,可以直接整合 SDK 架構,或使用 Swift Package Manager Beta 版。

  1. 如果沒有 Podfile,請先建立 Podfile。如果您使用快速入門範例,Xcode 專案和 Podfile (含 Pod) 就會一併提供。
$ cd MessagingExample
$ pod init
  1. 在 Podfile 中,加入要在應用程式中使用的 Firebase Pod。

您可以將任何支援的 Firebase 產品新增至 iOS 應用程式。

在快速入門範例中,Google Analytics 和 Firebase Cloud Messaging SDK 已新增完畢。

# Add the Firebase pod for Google Analytics
pod 'Firebase/Analytics'

# Add the pod for Firebase Cloud Messaging
pod 'Firebase/Messaging'
  1. 安裝 Pod,然後開啟 .xcworkspace 檔案,在 Xcode 中查看專案:
$ pod install
  1. 開啟 MessagingExample.xcworkspace,然後在 Firebase 控制台中按一下「下一步」1c5adae5b6e81655.png

在應用程式中初始化 Firebase

您需要在應用程式中加入 Firebase 初始化程式碼。

匯入 Firebase 模組,並設定共用執行個體 (在快速入門範例中,Firebase 模組已匯入)。

  1. UIApplicationDelegate 中匯入 Firebase 模組:

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. 設定 FirebaseApp 共用例項,通常是在應用程式的 application:didFinishLaunchingWithOptions: 方法中:

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. 在 Firebase 控制台中按一下「下一步」df93274c5922fd55.png
  2. Firebase SDK 已新增至應用程式。按一下「繼續前往主控台」21b24098a470aa40.png

5. 設定 FCM 用戶端

上傳 APN 驗證金鑰

將 APNs 驗證金鑰上傳至 Firebase。

  1. 在 Firebase 控制台的專案中,依序選取齒輪圖示和「專案設定」,然後選取「Cloud Messaging」分頁。

e1fcc1f1ace520e9.png

  1. 在「Apple 應用程式設定」下方的「APNs 驗證金鑰」中,按一下「上傳」按鈕,上傳開發或正式版驗證金鑰,或兩者皆上傳。至少擇一提供。

87ee87266eab43c4.png

  1. 瀏覽至您儲存金鑰的位置,選取金鑰,然後按一下「開啟」。新增金鑰的 ID (可在 Apple Developer Member Center 的「Certificates, Identifiers & Profiles」中取得),然後按一下「Upload」1491c513285d06e0.png

註冊遠端通知

在啟動時或應用程式流程中的所需時間點,註冊應用程式以接收遠端通知。

在快速入門範例中,registerForRemoteNotifications 已新增完畢。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

在 AppDelegate.swift 結尾處新增以下幾行,指派 UNUserNotificationCenter 的委派屬性。

AppDelegate.swift

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

設定訊息委派對象

如要接收註冊權杖,請實作訊息委派通訊協定,並在呼叫 [FIRApp configure] 後設定 FIRMessagingdelegate 屬性。舉例來說,如果應用程式委派項目符合訊息委派項目通訊協定,您可以在 application:didFinishLaunchingWithOptions: 上將委派項目設為本身 (在快速入門範例中,這項設定已完成)。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

在 AppDelegate.swift 結尾處新增以下幾行,指派 FIRMessaging 的委派屬性。

AppDelegate.swift

extension AppDelegate : MessagingDelegate {
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    print("Firebase registration token: \(String(describing: fcmToken))")
    
    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  }
}

新增功能

您已在「建立應用程式 ID」一節中新增「推播通知」功能,但您也必須在 Xcode 中新增這項功能,方法如下 (以下步驟適用於 Xcode 12.3):

  1. 在導覽器區域中按一下專案名稱。
  2. 按一下「簽署和功能」
  3. 按一下「+ 功能」

7207dce45aaa0fa.png

  1. 按兩下「Background Modes」
  2. 再次點按「+ 功能」
  3. 按兩下「推播通知」
  4. 檢查「背景模式」部分中的「遠端通知」

11a0a4f8a409fe44.png

6. 傳送通知訊息

如要傳送測試訊息,請按照下列步驟操作:

  1. 在目標裝置上安裝並執行應用程式。您必須接受接收遠端通知的權限要求。
  2. 在 Xcode 記錄中取得註冊權杖。

b9383e848d00ab04.png

  1. 確認裝置上的應用程式在背景執行。
  2. 開啟通知撰寫工具,然後選取「新通知」
  3. 輸入訊息文字。8f57ae055ce64321.png
  4. 選取「傳送測試訊息」
  5. 在標示為「新增 FCM 註冊權杖」的欄位中,輸入您在步驟 2 中取得的註冊權杖。
  6. 按一下 [測試]。

按一下「測試」後,目標用戶端裝置 (應用程式在背景執行) 應該會在通知中心收到通知。

如要瞭解訊息傳送至應用程式的情況,請參閱 FCM 報表資訊主頁,當中會記錄在 iOS 和 Android 裝置上傳送及開啟的訊息數量。

b790de9a3e0dc1ef.png

7. 恭喜

恭喜!您已成功傳送測試訊息!

FCM 中還有許多其他函式和設定,例如主題訂閱。

如要進一步瞭解這些功能,請參閱官方開發人員文件

後續步驟

查看一些程式碼研究室。

其他資訊