Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

在 Android 上設置 Firebase Cloud Messaging 客戶端應用

寫下你的火力地堡雲端通訊Android客戶端應用程序,使用FirebaseMessaging API和Android的工作室1.4或更高版本與搖籃。本頁面的說明假定您已經完成了步驟添加火力地堡到您的Android項目

FCM 客戶端需要運行 Android 4.1 或更高版本並安裝了 Google Play Store 應用程序的設備,或者運行帶有 Google API 的 Android 4.1 的模擬器。請注意,您不僅限於通過 Google Play 商店部署您的 Android 應用程序。

設置 SDK

如果您已為您的應用啟用其他 Firebase 功能,則本部分涵蓋您可能已完成的任務。

在你開始之前

如果你不已經有一個Android項目,只是想嘗試一個火力地堡的產品,你可以下載我們的一個入門示例

創建 Firebase 項目

在將 Firebase 添加到您的 Android 應用之前,您需要創建一個 Firebase 項目以連接到您的 Android 應用。參觀了解火力地堡項目,詳細了解項目的火力地堡。

向 Firebase 註冊您的應用

要在您的 Android 應用中使用 Firebase,您需要向您的 Firebase 項目註冊您的應用。註冊您的應用程序通常稱為將您的應用程序“添加”到您的項目中。

  1. 轉至火力地堡控制台

  2. 在項目概述頁面的中心,點擊圖標的Android( )或添加應用程序來啟動安裝工作流程。

  3. Android包名稱字段中輸入您的應用程式套件名稱。

  4. (可選)輸入其他應用程序的信息:應用程序的暱稱調試簽名證書SHA-1。

  5. 點擊註冊應用

添加 Firebase 配置文件

  1. 將 Firebase Android 配置文件添加到您的應用:

    1. 點擊下載谷歌,services.json獲得你的火力地堡的Android配置文件( google-services.json )。

    2. 將您的配置文件移動到您的應用程序的模塊(應用程序級)目錄中。

  2. 為使火力地堡的產品在你的應用程序,添加了谷歌的服務插件到您的搖籃文件。

    1. 在你的根級別(項目級別)搖籃文件( build.gradle ),添加規則,包括谷歌服務搖籃插件。檢查您是否也擁有 Google 的 Maven 存儲庫。

      buildscript {
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
        }
      
        dependencies {
          // ...
      
          // Add the following line:
          classpath 'com.google.gms:google-services:4.3.10'  // Google Services plugin
        }
      }
      
      allprojects {
        // ...
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
          // ...
        }
      }
      
    2. 在你的模塊(應用程序級)搖籃文件(通常是app/build.gradle ),應用谷歌服務搖籃插件:

      apply plugin: 'com.android.application'
      // Add the following line:
      apply plugin: 'com.google.gms.google-services'  // Google Services plugin
      
      android {
        // ...
      }
      

將 Firebase SDK 添加到您的應用

  1. 使用火力地堡Android的物料清單,聲明你的模塊(應用程序級)搖籃文件(通常為火力地堡雲端通訊的Android庫的依賴app/build.gradle )。

    對於火力地堡雲端通訊獲得最佳體驗,我們建議讓谷歌Analytics(分析)在您的火力地堡項目,並添加火力地堡SDK為谷歌Analytics(分析)應用程式。

    爪哇

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.2')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging'
        implementation 'com.google.firebase:firebase-analytics'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging:22.0.0'
        implementation 'com.google.firebase:firebase-analytics:19.0.2'
    }
    

    科特林+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.2')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx'
        implementation 'com.google.firebase:firebase-analytics-ktx'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx:22.0.0'
        implementation 'com.google.firebase:firebase-analytics-ktx:19.0.2'
    }
    

  2. 同步您的應用程序以確保所有依賴項都具有必要的版本。

編輯您的應用清單

將以下內容添加到您的應用清單:

  • 延伸服務FirebaseMessagingService 。如果您想在後台接收應用程序通知之外的任何消息處理,則這是必需的。要在前台應用程序中接收通知、接收數據負載、發送上游消息等,您必須擴展此服務。
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (可選)在應用程序組件中,用於設置默認通知圖標和顏色的元數據元素。只要傳入消息未明確設置圖標或顏色,Android 就會使用這些值。
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • (可選)從8.0的Android(API級26)和更高,通知信道被支持和推薦。 FCM 提供帶有基本設置的默認通知渠道。如果你喜歡創建和使用自己的默認通道,設定default_notification_channel_id到您的通知信道對象的ID如圖所示;每當傳入消息未明確設置通知通道時,FCM 將使用此值。要了解更多信息,請參閱管理通知渠道
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

訪問設備註冊令牌

在您的應用程序初始啟動時,FCM SDK 會為客戶端應用程序實例生成一個註冊令牌。如果你想針對單個設備或創建設備組,則需要通過擴展訪問此令牌FirebaseMessagingService並覆蓋onNewToken

本節介紹如何檢索令牌以及如何監視對令牌的更改。由於初始啟動後令牌可能會輪換,因此強烈建議您檢索最新更新的註冊令牌。

在以下情況下,註冊令牌可能會更改:

  • 該應用程序已在新設備上恢復
  • 用戶卸載/重新安裝應用程序
  • 用戶清除應用數據。

檢索當前的註冊令牌

當你需要獲取當前令牌,調用FirebaseMessaging.getInstance().getToken()

爪哇

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

科特林+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

監控令牌生成

onNewToken每當產生一個新的令牌回調火災。

爪哇

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

科特林+KTX

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

獲得令牌後,您可以將其發送到您的應用服務器並使用您喜歡的方法進行存儲。

檢查 Google Play 服務

依賴 Play 服務 SDK 的應用在訪問 Google Play 服務功能之前,應始終檢查設備是否有兼容的 Google Play 服務 APK。建議這樣做在兩個地方:在主要活動的onCreate()方法,並在其onResume()方法。在檢查onCreate()保證了該應用不能沒有檢查成功使用。在檢查onResume()確保了如果用戶返回到正在運行的應用通過一些其他手段,如通過返回按鈕,仍然是執行檢查。

如果設備不具備的谷歌遊戲服務兼容的版本,應用程序可以調用GoogleApiAvailability.makeGooglePlayServicesAvailable()以允許用戶從Play商店下載谷歌播放服務。

防止自動初始化

生成 FCM 註冊令牌後,該庫會將標識符和配置數據上傳到 Firebase。如果你喜歡以防止令牌自動生成,禁止Analytics收集和FCM自動初始化通過將這些元數據值到你(你必須同時禁用) AndroidManifest.xml

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

要重新啟用 FCM 自動初始化,請進行運行時調用:

爪哇

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

科特林+KTX

Firebase.messaging.isAutoInitEnabled = true

要重新啟用Analytics收集,調用setAnalyticsCollectionEnabled()的方法FirebaseAnalytics類。例如:

setAnalyticsCollectionEnabled(true);

一旦設置,這些值在應用程序重新啟動後仍然存在。

下一步

客戶端應用程序建立後,你就可以開始與發送下行消息通知作曲家。該功能是證明了在快速啟動示例,您可以下載,運行,和審查。

要將其他更高級的行為添加到您的應用程序,您可以聲明一個意圖過濾器並實施一個活動來響應傳入的消息。有關詳細信息,請參閱從應用服務器發送消息的指南:

請記住,利用這些功能,您將需要一個服務器實現與服務器的網絡協議(HTTP或XMPP),或在一個實施管理SDK