1. ホーム
  2. android

[解決済み] Firebase FCMはonTokenRefresh()を強制的に呼び出します。

2022-08-25 23:24:29

質問

GCMからFCMにアプリを移行しています。

新しいユーザーが私のアプリをインストールするときに onTokenRefresh() が自動的に呼び出されます。問題は、そのユーザーがまだログインしていない(ユーザーIDがない)ことです。

をトリガーするにはどうしたらよいでしょうか。 onTokenRefresh() をトリガーするにはどうしたらよいでしょうか?

どのように解決するのですか?

この onTokenRefresh() メソッドは、新しいトークンが生成されるたびに呼び出されます。アプリをインストールすると、(あなたが発見したように)すぐに生成されます。また、トークンが変更されたときにも呼び出されます。

によると FirebaseCloudMessaging のガイドを参照してください。

通知を特定の1台の端末に絞り込むことができます。アプリの初回起動時に アプリの初回起動時に、FCM SDK はクライアントアプリのインスタンスの登録トークンを生成します。 を生成します。

ソース・リンク https://firebase.google.com/docs/notifications/android/console-device#access_the_registration_token

つまり、トークンの登録はアプリごとということです。ユーザーがログインした後にトークンを利用したいようですね。そこで提案したいのは、トークンを onTokenRefresh() メソッドでトークンを内部ストレージまたは共有環境設定に保存します。そして、ユーザーがログインした後にストレージからトークンを取得し、必要に応じてサーバーにトークンを登録します。

もし手動で onTokenRefresh() を強制したい場合は、IntentServiceを作成し、トークンのインスタンスを削除することができます。その後、getToken を呼び出すと onTokenRefresh() メソッドが再び呼び出されます。

コード例です。

public class DeleteTokenService extends IntentService
{
    public static final String TAG = DeleteTokenService.class.getSimpleName();

    public DeleteTokenService()
    {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        try
        {
            // Check for current token
            String originalToken = getTokenFromPrefs();
            Log.d(TAG, "Token before deletion: " + originalToken);

            // Resets Instance ID and revokes all tokens.
            FirebaseInstanceId.getInstance().deleteInstanceId();

            // Clear current saved token
            saveTokenToPrefs("");

            // Check for success of empty token
            String tokenCheck = getTokenFromPrefs();
            Log.d(TAG, "Token deleted. Proof: " + tokenCheck);

            // Now manually call onTokenRefresh()
            Log.d(TAG, "Getting new token");
            FirebaseInstanceId.getInstance().getToken();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void saveTokenToPrefs(String _token)
    {
        // Access Shared Preferences
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();

        // Save to SharedPreferences
        editor.putString("registration_id", _token);
        editor.apply();
    }

    private String getTokenFromPrefs()
    {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        return preferences.getString("registration_id", null);
    }
}

EDIT

<ブロッククオート

FirebaseInstanceIdServiceです。

public class FirebaseInstanceIdService extends Service (パブリッククラス Firebase インスタンスIDサービス)

このクラスは非推奨です。FirebaseMessagingService の onNewToken をオーバーライドすることにしました。それが実装されれば が実装されれば、このサービスは安全に削除できます。

onTokenRefresh()は 非推奨 . 使用方法 onNewToken()MyFirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.e("NEW_TOKEN",s);
    }

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    }
}