web-dev-qa-db-ja.com

Firebase onTokenRefresh()は呼び出されません

ログのMainActivityで、FirebaseInstanceId.getInstance().getToken()を使用してトークンを確認し、生成されたトークンを表示します。しかし、それがMyFirebaseInstanceIDServiceに拡張されるFirebaseInstanceIdServiceでは、onTokenRefresh()は呼び出されないようです。この関数では、トークンは最初にここで生成されると言われています。 sendRegistrationToServer()を呼び出す必要があったので、それがonTokenRefresh()に入らない理由を知りたいのです。

ここに私のコードがあります

public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {


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

        sendRegistrationToServer(refreshedToken);
    }
}
68
natsumiyu

firebaseInstanceIdServiceのonTokenRefreshは、新しいトークンが生成されたときにのみ呼び出されます。アプリが以前にインストールされてトークンを生成した場合、onTokenRefreshは呼び出されません。アプリをアンインストールして再インストールし、新しいトークンを強制的に生成してみてください。これにより、onTokenRefreshが呼び出されます。

また、FirebaseInstanceIdServiceがAndroidManifest.xmlで適切に定義されていることを確認してください

マニフェストファイル内。

 <service
        Android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService"
        Android:exported="false">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        Android:name="com.bnt.etailers.fcm.GCMNotificationIntentService"
        Android:exported="false">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

FirebaseInstanceIdServiceクラス

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService {


private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName();

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

    if (refreshedToken!=null) {
        SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken);
    }
    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
}}

FirebaseMessagingServiceクラス。

public class GCMNotificationIntentService extends FirebaseMessagingService {
// Sets an ID for the notification, so it can be updated


public GCMNotificationIntentService() {
    super();
}


@Override
public void onMessageReceived(RemoteMessage message) {

}}
100
Sagar Gangawane

私はあなたと同じ問題を抱えていました。私の間違いは次のとおりです:AndroidManifest.xmlファイルの<service>タグを<application>タグの外側に配置しました。

今、私は次のようになります:

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

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

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

そして、それは問題なく動作します。

22
viplezer

はい、これは時々起こるかもしれません。

Fcm idを取得したい場所で次のメソッドを呼び出してください。

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
13
Surendar D

最初にデバイスまたはエミュレーターからアンインストールして、アプリを再インストールしてください。その後、新しいトークンが生成されるため、onTokenRefresh()が再度呼び出されます。

12
faruk

私の場合、マニフェストにインターネット許可を追加するのを忘れましたが、

<uses-permission Android:name="Android.permission.INTERNET" />

ほとんどの人がこの間違いをしないことを願っています。

12
Sreedhu Madhu

追加したことを確認してください

プラグインの適用: 'com.google.gms.google-services'

これをapp.gradleファイルの最後まで

3
user2837615
try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

onCreateメソッドでトークンを削除します。

3
pru

再インストールは私のためのトリックをしました!

2
Sterling Diaz

インターネット接続が利用できないデバイスでアプリケーションを実行しているとき、MyFirebaseInstanceIDServiceが呼び出されないことを経験しました。この方法では、onTokenRefresh()は呼び出されません。更新されたFirebaseTokenを取得するには、アプリケーションの実行中にデバイスがインターネットに接続している必要があります。

また、以前のアプリをアンインストールします-再インストール更新されたトークンを取得するために。登録トークンは次の場合に変更されます。

1)アプリはインスタンスIDを削除します

2)アプリは新しいデバイスに復元されます

3)ユーザーがアプリをアンインストール/再インストールする

4)ユーザーがアプリのデータを消去します。

2
Sheharyar Ejaz

私の場合、すべてを試しましたが、onTokenRefreshは呼び出されませんでした。次に、WiFiを変更し、別のnetworkに接続します。以前のWiFiのインターネット接続は良好です。なぜ発生したのかわかりません。これは誰かを助けることができるかもしれません。

呼び出されていないonTokenRefreshを呼び出さない理由はいくつかあります。私はそれをリストして、一つ一つ言及しました。

  1. インターネット許可が追加されていることを確認してください

  2. プロジェクトのアプリディレクトリ内のGoogleコンソールから生成するgoogle-services.jsonファイルを追加したことを確認してください

enter image description here

  1. モジュールGradleファイル(通常app/build.gradle)で、ファイルの下部に適用プラグイン行を追加して、Gradleプラグインを有効にします。
apply plugin: 'com.Android.application'

Android {
  // ...
}

dependencies {
  // ...
  implementation 'com.google.firebase:firebase-core:16.0.4'

  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

4)プロジェクトレベルのbuild.gridleファイルに再生サービスクラスパスを追加する

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        // ...
        google() // Google's Maven repository
    }
}

5)アプリケーションタグ内のAndroidManifesファイルにこれらのサービスが追加されていることを確認してください

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

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

6)トークンの更新時および最初のアプリのインストール時にonToken更新が呼び出されるため、アプリを手動で削除するか、データをクリアしてください。

7)サービスクラスでFirebaseMessagingServiceを拡張していることを確認します

2

私はそれと1時間以上苦労していましたが、次のコードを変更すると突然動作しました。

refreshedTokenを次のように処理します。

String refreshedToken;
    try {
        refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        Localytics.setPushRegistrationId(refreshedToken);
    } catch (Exception e) {
        Log.d(TAG, "Refreshed token, catch: " + e.toString());
        e.printStackTrace();
    }

Android:exported = "true">をマニフェストのMyFirebaseMessagingServiceとMyFirebaseInstanceIDServiceの両方に追加してみてください。

<service
        Android:name="com.localytics.Android.sample.fcm.MyFirebaseMessagingService"
        Android:exported="true">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service
        Android:name="com.localytics.Android.sample.fcm.MyFirebaseInstanceIDService"
        Android:exported="true">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

アプリをアンインストールして、もう一度インストールしてください。実際のデバイスでテスト済み。

Android:exported = "true"はデフォルトのオプションであるため、完全に削除することもでき、trueに設定されます。

また、onTokenRefreshをより明示的に呼び出す場合は、コード内のどこでも簡単に呼び出すことができます。

String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);

放送の受信に依存する必要はもうありません

1
danjar

同じ問題がありました。私のデバイス(KitKat 4.4.2)は、何らかの理由でonTokenRefresh()を取得できませんでした。私のインターネット接続は完璧で、グーグルプレイサービスは最新で、firebaseが機能するために必要な条件はすべて満たされていました。私のコードは、デバイス5.0.0以降で完全に機能しました。この問題を解決するには、デバイスを工場出荷時の設定にリセットする必要があり、アプリケーションが動作し始めました。私はそれが厳しい尺度であることを知っていますが、おそらくそれは誰かを助けるかもしれません。 onTokenRefresh()が呼び出されない原因となるいくつかの問題または他のアプリケーションとの競合が存在する必要があります。がんばろう!

1