1. 簡介
上次更新時間:2020 年 1 月 6 日
Firebase 雲端通訊 (FCM) 是跨平台的訊息傳遞解決方案,能以可靠的方式傳送訊息,而且無須額外付費。
使用 FCM 時,您可以通知用戶端應用程式有新電子郵件或其他資料可以同步處理。您可以傳送通知訊息,吸引使用者再次參與並提升留存率。針對即時通訊等用途,訊息可以將最大 4 KB 的酬載傳輸到用戶端應用程式。
運作方式
實作 FCM 包括傳送和接收兩個主要元件:
- 受信任的環境,例如 Cloud Functions for Firebase 或應用程式伺服器,可在其中建構、指定及傳送訊息。
- 一種 iOS、Android 或網路 (JavaScript) 用戶端應用程式,可透過對應的平台專用傳輸服務接收訊息。
FCM 架構總覽
FCM 仰賴以下元件組合,這些元件用於建構、傳輸及接收訊息:
- 撰寫或建構訊息要求的工具。通知編輯器提供以 GUI 為基礎的選項,可用於建立通知要求。如要全面自動化及支援所有訊息類型,您必須在支援 Firebase Admin SDK 或 FCM 伺服器通訊協定的受信任伺服器環境中建立訊息要求。這個環境可以是 Cloud Functions for Firebase、Google App Engine 或您自己的應用程式伺服器。
- FCM 後端 (還有其他函式) 會接收訊息要求、透過主題展開訊息,並產生訊息 ID 等訊息中繼資料。
- 平台層級傳輸層,可將訊息轉送至指定裝置、處理訊息傳送作業,以及視情況套用平台專屬的設定。這個傳輸層包括:
- 搭載 Google Play 服務的 Android 裝置適用的 Android 傳輸層 (ATL)
- iOS 裝置適用的 Apple 推播通知服務 (APN)
- 網頁應用程式的網路推送通訊協定
- 使用者裝置上的 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):
- 開啟 XCode 並選取「Create a new Xcode project」。
- 選取「應用程式」,然後點選「下一步」。
- 輸入 Product Name (例如MessagingExample)
- 選取「Team」 (如果您尚未建立團隊,請在 Apple 開發人員帳戶中設定團隊)。
- 輸入機構 ID (例如
com.
your-name
) - 輸入 Bundle Identifier (例如
com.
your-name
.MessagingExample
,此 ID 在所有 iOS 應用程式中均不得重複)。 - 在「Interface」下拉式選單中選取「Storyboard」。
- 在「Life Cycle」下拉式選單中選取「UIKit App Delegate」。
- 在「Language」(語言) 部分選取「Swift」SwiftSwift。
- 點選「下一步」。
建立 APN 金鑰並將應用程式註冊至 Firebase 專案時,您會需要軟體包 ID。
3. 設定 APN
建立驗證金鑰
本節說明如何為已啟用推播通知的應用程式 ID 產生驗證金鑰。如果已有金鑰,您可以使用該金鑰,不必產生新的金鑰。
如何建立驗證金鑰:
- 在開發人員帳戶中前往「憑證、ID 與」設定檔,然後前往「Keys」(金鑰)。
- 按一下右上角的「新增」按鈕 (+)。
- 輸入 APN 驗證金鑰的說明
- 在「金鑰服務」下方,勾選「APN」核取方塊,然後按一下「繼續」。
- 依序按一下「Register」和「Download」。請將金鑰保存在安全的地方。此為一次性下載,之後將無法擷取此金鑰。
建立應用程式 ID
應用程式 ID 是專門用來識別應用程式的識別碼。慣例是由反向網域所代表。
- 前往 Apple Developer Member Center 並登入帳戶。
- 前往「Certificates, Identifiers and Profiles」(憑證、ID 和設定檔)。
- 前往「ID」。
- 按一下「+」按鈕建立新的應用程式 ID。
- 選取「應用程式 ID」圓形按鈕,然後按一下「繼續」。
- 選取「應用程式」,然後按一下「繼續」。
- 如要建立新的應用程式 ID,請按照下列步驟操作:
- 輸入應用程式 ID 的「名稱」。
- 輸入團隊 ID。這個值必須與「會員資格」分頁中的團隊 ID 相符。
- 在「應用程式 ID 後置字串」部分中選取「明確應用程式 ID」,然後輸入您的軟體包 ID。
- 在「應用程式服務」部分中,確認已勾選「推播通知」。
- 按一下「繼續」,確認輸入內容正確無誤:
- 「Identifier」的值應與團隊 ID 值和軟體包 ID 的串連值相符
- 推播通知應為「可設定」
- 按一下「Register」,建立應用程式 ID。
建立設定檔
如要在開發期間測試應用程式,您必須取得開發用設定檔,授權裝置執行尚未發布至 App Store 的應用程式。
- 前往 Apple Developer Member Center 並登入帳戶。
- 前往「Certificates, Identifiers and Profiles」(憑證、ID 和設定檔)。
- 在左上角的下拉式選單中,選取「iOS、tvOS、watchOS」 (如果尚未選取),請前往「Profiles」。
- 按一下「+」按鈕,建立新的設定檔。
- 選取「iOS App Development」做為佈建設定檔類型,然後按一下「繼續」。
- 在下拉式選單中,選取您要使用的應用程式 ID,然後按一下「繼續」。
- 選取您在上一個步驟中所選擇的應用程式 ID 的 iOS 開發憑證,然後按一下 [繼續]。
- 選取您要納入佈建設定檔的 iOS 裝置,然後按一下 [繼續]。請務必選取所有要用於測試的裝置。
- 輸入這個佈建設定檔的名稱 (例如 MessagingExampleProfile),然後按一下「產生」。
- 點選 [下載],將佈建設定檔儲存到 Mac。
- 按兩下佈建設定檔即可安裝。
4. 將 Firebase 新增至您的 iOS 專案
建立 Firebase 專案
您必須先建立要連結至 iOS 應用程式的 Firebase 專案,才能將 Firebase 加進 iOS 應用程式。如要進一步瞭解 Firebase 專案,請參閱「瞭解 Firebase 專案」一文。
- 在 Firebase 控制台中,按一下「新增專案」,然後選取或輸入「專案名稱」。
如果您有現有的 Google Cloud Platform (GCP) 專案,可以從下拉式選單中選取該專案,將 Firebase 資源新增至該專案。
- (選用) 如要建立新專案,您可以編輯專案 ID。
Firebase 會自動為你的 Firebase 專案指派專屬 ID。請前往「瞭解 Firebase 專案」頁面,瞭解 Firebase 如何使用專案 ID。
- 按一下「繼續」。
- 為專案設定 Google Analytics,以便使用下列任一 Firebase 產品,享有最佳體驗:
- Firebase Crashlytics
- Firebase 預測
- Firebase 雲端通訊
- Firebase 應用程式內通訊
- Firebase 遠端設定
- Firebase A/B 測試
看到提示時,請選擇使用現有的 Google Analytics 帳戶或建立新帳戶。如果您選擇建立新帳戶,請選取 Analytics 報表位置,然後接受專案的資料共用設定和 Google Analytics 條款。
- 按一下「建立專案」。如果使用現有的 GCP 專案,請按一下「新增 Firebase」。
Firebase 會自動為你的 Firebase 專案佈建資源。程序完成後,系統就會將您帶往 Firebase 控制台中 Firebase 專案的總覽頁面。
向 Firebase 註冊應用程式
建立 Firebase 專案後,您可以在專案中新增 iOS 應用程式。
如要進一步瞭解在 Firebase 專案中新增應用程式的最佳做法和注意事項,包括如何處理多個建構變數,請參閱「瞭解 Firebase 專案」一文。
- 前往 Firebase 主控台。
- 在專案總覽頁面中間,按一下「iOS」iOS圖示來啟動設定工作流程。
已在 Firebase 專案中加入應用程式,點選「新增應用程式」即可顯示平台選項。
- 在「iOS 軟體包 ID」欄位中輸入應用程式的軟體包 ID。
- (選用) 輸入其他應用程式資訊:「應用程式暱稱」和「App Store ID」。
- 按一下 [Register app] (註冊應用程式)。
新增 Firebase 設定檔
- 點選「Download GoogleService-Info.plist」,取得 Firebase iOS 設定檔 (
GoogleService-Info.plist
)。 - 將設定檔移至 Xcode 專案的根目錄。如果出現提示,請選擇將設定檔新增至所有目標。
如果專案中有多個軟體包 ID,請務必在 Firebase 控制台中將每個軟體包 ID 與已註冊的應用程式建立關聯,讓每個應用程式擁有專屬的 GoogleService-Info.plist
檔案。
關閉 XCode。
在應用程式中新增 Firebase SDK
我們建議使用 CocoaPods 安裝 Firebase 程式庫。不過,如果您不想使用 CocoaPods,可以直接整合 SDK 架構,或使用 Swift Package Manager Beta 版。
- 如果您尚未建立 Podfile,請建立一個。如果您使用的是快速入門導覽課程範例,則其中的 Xcode 專案和 Podfile (含 Pod) 已存在。
$ cd MessagingExample $ pod init
- 將您要在應用程式中使用的 Firebase Pod 新增至 Podfile。
您可以將任何支援的 Firebase 產品新增至您的 iOS 應用程式。
本快速入門導覽課程範例已加入 Google Analytics 和 Firebase 雲端通訊 SDK。
# Add the Firebase pod for Google Analytics pod 'Firebase/Analytics' # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'
- 安裝 Pod,然後開啟
.xcworkspace
檔案即可在 Xcode 中查看專案:
$ pod install
- 開啟
MessagingExample.xcworkspace
,然後在 Firebase 控制台中點選「Next」(下一步)。
在應用程式中初始化 Firebase
您必須將 Firebase 初始化程式碼加進應用程式。
匯入 Firebase 模組並設定共用執行個體 (在快速入門導覽課程範例中,系統已匯入 Firebase 模組)。
- 將 Firebase 模組匯入
UIApplicationDelegate
中:
AppDelegate.swift
import UIKit
import Firebase // Add this line
- 設定 FirebaseApp 共用執行個體,通常在應用程式的
application:didFinishLaunchingWithOptions:
方法中:
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure() // Add this line
return true
}
- 在 Firebase 控制台中,點選「下一步」。
- Firebase SDK 已新增至您的應用程式。按一下「Continue to console」。
5. 設定 FCM 用戶端
上傳 APN 驗證金鑰
將 APN 驗證金鑰上傳至 Firebase。
- 在 Firebase 控制台的專案中,依序選取齒輪圖示 >「專案設定」,然後選取「雲端通訊」分頁標籤。
- 在「iOS app settings」下方的「APNs 驗證金鑰」中,按一下「上傳」按鈕。
- 找到您儲存金鑰的位置,選取金鑰,然後按一下「Open」。新增金鑰 ID (可在 Apple Developer Member Center 的憑證、ID 與設定檔中找到),然後按一下「上傳」。
註冊遠端通知
無論是啟動時或應用程式流程中的所需環節,都請註冊應用程式,以便接收遠端通知。
已在快速入門導覽課程範例中新增 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]
後導入訊息委派通訊協定,並設定 FIRMessaging
的 delegate
屬性。舉例來說,如果您的應用程式委派代表符合訊息委派通訊協定,您可以將 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):
- 在導覽器區域按一下專案名稱。
- 依序按一下 [登入與]功能。
- 按一下「+ 功能」。
- 按兩下「背景模式」。
- 再次按一下「+ 功能」。
- 按兩下「推播通知」。
- 在「背景模式」部分中,勾選「遠端通知」。
6. 傳送通知訊息
您可以按照下列步驟傳送測試訊息:
- 在目標裝置上安裝並執行應用程式。您必須接受權限要求,才能接收遠端通知。
- 在 XCode 記錄檔中取得註冊權杖。
- 確認應用程式在裝置的背景執行。
- 開啟通知編輯器,然後選取「新通知」。
- 輸入訊息文字。
- 選取「傳送測試郵件」。
- 在標示為「新增 FCM 註冊權杖」的欄位中,輸入您在步驟 2 取得的註冊權杖。
- 按一下 [測試]。
按一下「測試」之後,指定的用戶端裝置 (應用程式在背景執行) 應該會在通知中心收到通知。
如要進一步瞭解傳送至應用程式的訊息,請參閱 FCM 報告資訊主頁,其中會記錄在 iOS 和 Android 裝置上傳送及開啟的訊息數量。
7. 恭喜
恭喜,您已成功傳送測試訊息!
FCM 還有其他功能與設定 (例如主題訂閱)。
如要瞭解詳情,請參閱官方開發人員文件。
後續步驟
請查看部分程式碼研究室。