web-dev-qa-db-ja.com

FirebaseのFCMトークンとは何ですか?

新しいFirebaseでは、通知の下で、開発者が特定のデバイスに通知を送信できると述べています。そのために、コンソールでFCMトークンを要求します。それは正確に何であり、どのようにしてそのトークンを取得できますか?

42
arunrk

正確には何ですか?

FCMトークン、または google-cloud-messaging のようなregistrationTokenとしてよく知られています。で説明されているように GCM FCM docs

GCM接続サーバーによってクライアントアプリに発行され、メッセージを受信できるようにするID。登録トークンは秘密にしておく必要があることに注意してください。


どうすればそのトークンを取得できますか?

UpdategetToken()を呼び出すことでトークンを取得できますが、FCMの最新バージョンにより、FirebaseInstanceIdService.onTokenRefresh()に置き換えられましたFirebaseMessagingService.onNewToken() -私の経験では、 onTokenRefresh() did と同じように機能します。


古い答え:

FCM docs に従って:

アプリの初回起動時に、FCM SDKはクライアントアプリインスタンスの登録トークンを生成します。単一のデバイスをターゲットにする場合、またはデバイスグループを作成する場合は、このトークンにアクセスする必要があります。

FirebaseInstanceIdServiceを拡張することにより、トークンの値にアクセスできます。マニフェストにサービスを追加したことを確認してから、onTokenRefreshのコンテキストでgetTokenを呼び出し、次のように値を記録します。

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}

OnTokenRefreshcallbackは、新しいトークンが生成されるたびに起動するため、コンテキストでgetTokenを呼び出すと、現在の利用可能な登録トークンに確実にアクセスできます。トークンがまだ生成されていない場合、FirebaseInstanceID.getToken()はnullを返します。

トークンを取得したら、アプリサーバーに送信し、好みの方法でトークンを保存できます。 APIの詳細については、インスタンスID APIリファレンスをご覧ください。

55
AL.

このグラドルを追加する簡単な手順は次のとおりです。

dependencies {
  compile "com.google.firebase:firebase-messaging:9.0.0"
}

GCMのようなマニフェストに追加の許可は必要ありません。 GCMのようなマニフェストに受信者は必要ありません。 FCMでは、com.google.Android.gms.gcm.GcmReceiverが自動的に追加されます。

リスナーサービスを移行します

InstanceIDListenerServiceを拡張するサービスは、FCMトークンにアクセスする場合にのみ必要になりました。

あなたがしたい場合、これが必要です

  • デバイストークンを管理して、単一のデバイスにメッセージを直接送信するか、デバイスグループにメッセージを送信する、または
  • デバイスグループにメッセージを送信する、または
  • サーバーサブスクリプション管理APIを使用して、デバイスをトピックにサブスクライブします。

マニフェストにサービスを追加

<service
    Android:name=".MyInstanceIDListenerService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

<service
    Android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

MyInstanceIDListenerServiceを変更してFirebaseInstanceIdServiceを拡張し、コードを更新してトークンの更新をリッスンし、新しいトークンが生成されるたびにトークンを取得します。

public class MyInstanceIDListenerService extends FirebaseInstanceIdService {

  ...

  /**
   * Called if InstanceID token is updated. This may occur if the security of
   * the previous token had been compromised. Note that this is also called
   * when the InstanceID token is initially generated, so this is where
   * you retrieve the token.
   */
  // [START refresh_token]
  @Override
  public void onTokenRefresh() {
      // Get updated InstanceID token.
      String refreshedToken = FirebaseInstanceId.getInstance().getToken();
      Log.d(TAG, "Refreshed token: " + refreshedToken);
      // TODO: Implement this method to send any registration to your app's servers.
      sendRegistrationToServer(refreshedToken);
  }

}

詳細情報をご覧ください

  1. 以前のGCMプロジェクトをFirebaseにインポートする方法
  2. トークンの更新を強制する方法
  3. トークンへのアクセス方法
  4. Firebaseのセットアップ方法
6

FirebaseInstanceIdServiceは非推奨になりました。 FirebaseMessagingServiceのonNewTokenメソッドでトークンを取得する必要があります。

ドキュメントをご覧ください

4
nir

情報を取得できる「Firebase Cloud Messagingトークン」に関する更新があります。

私は本当にその変更について知りたかったので、サポートチームにメールを送信しました。 Firebase Cloud Messagingトークンは、すぐにサーバーキーに戻ります。変更するものは何もありません。まもなくサーバーキーが表示されます。

2
PM11

以下のリリースノートのgetToken()メソッドは廃止されました。代わりに、getInstanceIdを使用する必要があります。

https://firebase.google.com/docs/reference/Android/com/google/firebase/iid/FirebaseInstanceId

Task<InstanceIdResult> task = FirebaseInstanceId.getInstance().getInstanceId();
task.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
      @Override
      public void onSuccess(InstanceIdResult authResult) {
          // Task completed successfully
          // ...
          String fcmToken = authResult.getToken();
      }
});

task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
    // Task failed with an exception
    // ...
}
});

同じリスナーで成功と失敗を処理するには、OnCompleteListenerをアタッチします。

task.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
    if (task.isSuccessful()) {
        // Task completed successfully
        InstanceIdResult authResult = task.getResult();
        String fcmToken = authResult.getToken();
    } else {
        // Task failed with an exception
        Exception exception = task.getException();
    }
}
});

また、FirebaseInstanceIdServiceクラスは廃止され、onTokenRefreshの代わりにFireBaseMessagingServiceのonNewTokenメソッドが登場しました。

ここでリリースノートを参照できます https://firebase.google.com/support/release-notes/Android

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Use this code logic to send the info to your server.
    //sendRegistrationToServer(s);
}
2
Manoj Kumar