本快速入門導覽課程說明如何在行動和網頁用戶端應用程式中設定 Firebase Cloud Messaging,以便穩定傳送訊息。如為伺服器環境,請參閱「您的伺服器環境和FCM」。
在 Flutter 上設定 Firebase 雲端通訊用戶端應用程式
視目標平台而定,您可能需要完成其他設定步驟。
iOS+
方法交換
如要在 Apple 裝置上使用 FCM Flutter 外掛程式,必須進行方法交換。如果沒有這個檔案,FCM 權杖處理等重要 Firebase 功能就無法正常運作。
Android
Google Play 服務
FCM 用戶端必須使用搭載 Android 4.4 以上版本,且已安裝 Google Play 服務的裝置,或是執行 Android 4.4 並使用 Google API 的模擬器。請注意,您不一定要透過 Google Play 商店部署 Android 應用程式。
如果應用程式使用 Play 服務 SDK,存取 Google Play 服務功能前,請務必先檢查裝置是否安裝相容的 Google Play 服務 APK。建議在兩個位置執行這項操作:主要活動的 onCreate() 方法和 onResume() 方法。onCreate() 檢查可確保應用程式必須通過檢查才能使用。onResume() 中的檢查可確保使用者透過其他方式 (例如返回按鈕) 返回執行中的應用程式時,系統仍會執行檢查。
如果裝置沒有相容版本的 Google Play 服務,應用程式可以呼叫 GoogleApiAvailability.makeGooglePlayServicesAvailable(),讓使用者從 Play 商店下載 Google Play 服務。
網頁
使用「FCM」設定網站憑證
FCM 網頁介面會使用稱為「自願應用程式伺服器識別碼」或「VAPID」金鑰的網頁憑證,授權傳送要求給支援的網頁推播服務。如要讓應用程式訂閱推播通知,您需要將一組金鑰與 Firebase 專案建立關聯。您可以透過 Firebase 控制台產生新的金鑰組,或是匯入現有的金鑰組。
安裝 FCM 外掛程式
如果尚未安裝及初始化 Flutter 適用的 Firebase 外掛程式,請執行此步驟。
在 Flutter 專案的根目錄中,執行下列指令來安裝外掛程式:
flutter pub add firebase_messaging完成後,請重建 Flutter 應用程式:
flutter run
存取註冊權杖
如要傳送訊息給特定裝置,您必須知道裝置的註冊權杖。如要擷取應用程式例項的註冊權杖,請呼叫 getToken()。如果尚未授予通知權限,這個方法會要求使用者授予通知權限。否則,系統會傳回權杖,或因發生錯誤而拒絕 Future。
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
在網頁平台,將 VAPID 公開金鑰傳遞至 getToken():
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
如要在權杖更新時收到通知,請訂閱 onTokenRefresh 串流:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
防止自動初始化
產生 FCM 註冊權杖時,程式庫會將 ID 和設定資料上傳至 Firebase。如要避免自動產生權杖,請在建構時停用自動初始化。
iOS
在 iOS 上,將中繼資料值新增至 Info.plist:
FirebaseMessagingAutoInitEnabled = NO
Android
在 Android 上,將下列中繼資料值新增至 AndroidManifest.xml,即可停用 Analytics 收集功能和 FCM 自動初始化功能 (您必須同時停用這兩項功能):
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
重新啟用 FCM 執行階段自動初始化
如要為特定應用程式例項啟用自動初始化功能,請呼叫 setAutoInitEnabled():
await FirebaseMessaging.instance.setAutoInitEnabled(true);
設定後,這個值會在應用程式重新啟動時保留。
傳送測試通知訊息
- 在目標裝置上安裝並執行應用程式。在 Apple 裝置上,你必須接受接收遠端通知的權限要求。
- 確認裝置上的應用程式在背景執行。
- 在 Firebase 控制台中,開啟「Messaging」頁面。
- 如果是第一次建立訊息,請選取「建立您的第一個廣告活動」。
- 選取「Firebase 通知訊息」,然後選取「建立」。
- 否則,請在「廣告活動」分頁中選取「新增廣告活動」,然後選取「通知」。
- 輸入訊息文字。
- 在右側窗格中選取「傳送測試訊息」。
- 在標示為「新增 FCM 註冊權杖」的欄位中,輸入註冊權杖。
- 選取「測試」。
選取「測試」後,目標用戶端裝置應會收到通知,且應用程式會在背景執行。
如要深入瞭解訊息傳送至應用程式的情況,請參閱 FCM 報表資訊主頁,其中會記錄在 Apple 和 Android 裝置上傳送及開啟的訊息數量,以及 Android 應用程式的曝光資料。
處理互動
在 Android 和 iOS 裝置上,使用者輕觸通知時的預設行為都是開啟應用程式。如果應用程式已終止,系統會啟動應用程式;如果應用程式在背景執行,系統會將其移至前景。
視通知內容而定,您可能想在應用程式開啟時處理使用者的互動。舉例來說,如果使用者透過通知傳送新的即時通訊訊息,並選取該訊息,您可能會希望在應用程式開啟時,開啟特定對話。
firebase-messaging 套件提供兩種處理這類互動的方式:
getInitialMessage():如果應用程式是從終止狀態開啟,這個方法會傳回包含RemoteMessage的Future。RemoteMessage一經使用就會移除。onMessageOpenedApp:應用程式從背景狀態開啟時,會發布RemoteMessage的Stream。
為確保使用者體驗順暢,您應處理這兩種情況。以下程式碼範例說明如何達成這個目標:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
互動的處理方式取決於您的設定。先前顯示的範例是使用 StatefulWidget 的基本範例。
後續步驟
完成設定步驟後,您可以選擇下列幾種方式繼續使用 Flutter 的 FCM: