web-dev-qa-db-ja.com

Firebase Cloud MessagingがFirebaseInstanceIdを呼び出さない

このガイドに従ってGCMをFCMに更新しました ここ 。サイトによると、トークンが生成されるとすぐに、FirebaseInstanceIdServiceを拡張するサービスが呼び出されます。何らかの理由で、私のサービスが呼び出されたり、onTokenRefreshが実行されたりすることはありません。

ガイドによると、私のサービスは次のように登録されています:

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

<service Android:name=".fcm.InstanceIdService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCEID_EVENT"/>
    </intent-filter>
</service>
_

私のサービス:

_public class InstanceIdService extends FirebaseInstanceIdService {

    private static final String TAG = "InstanceIdService";

    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();

        Log.e(TAG, "Got token: " + token);
    }
}
_

LogCatは、構成ファイルの欠落などについて何も言わず、FirebaseAppに関するログとトークンに言及するLogエントリを表示できますが、それでもサービスが呼び出されることはありません。

アクティビティのどこかでこのサービスを開始する必要がありますか?私は何か間違ったことをしていますか?誰かが正しい方向に案内してくれますか?

編集:Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken());を使用すると、トークンが正しく出力されるため、トークンが正常に生成されたことを意味します。サービスはまだ呼び出されません...

編集2:INSTANCEID_EVENTをINSTANCE_ID_EVENTに変更すると問題が解決しましたが、アプリを再インストールする必要がありました。新しいFCMを含むベータ版をすでにリリースしているため、ベータ版のテスターはトピックにサブスクライブして、受信メッセージを復習できません。それで、どうすればそれを解決できますか?

11
qwertz

これを理解してくれたEndankeに感謝します。 Firebaseのドキュメントに一貫性がないようです。 1ページ は、マニフェストファイル内のインテントフィルターがINSTANCE_ID_EVENTである必要があることを示し、 anotherINSTANCEID_EVENTを示します。

INSTANCE_ID_EVENTを使用する必要があります。変更を加えたら、変更を有効にするためにアプリを完全にアンインストールして再インストールする必要があります。

11
Zach Rattner

FCMはGCMの代わりとして使用する必要があります。あなたの場合、マニフェストにFCMとGCMの両方のサービスがあるようです。 gcm.GcmServiceを削除してみてください。FirebaseInstanceIdを拡張するもののみを使用してください。

2
Arthur Thompson

試行錯誤を繰り返した後、私の問題はアプリケーションタグにtools:node = "replace"が含まれていたことです...それを削除すると問題が解決しました

1
jai

「Firebase Cloud Messaging」が求めているものは次のとおりです。

  • FirebaseInstanceIdServiceからの派生クラス(MyFirebaseInstanceIdService)を実装します。
  • デバイスのトークンの更新を処理するには、オーバーライドonTokenRefreshを実装します。
  • AndroidManifest.xmlで、「。」で始まる「派生」クラスを参照します。

MyFirebaseInstanceIdServiceは「推奨」名です。私は個人的に、このような派生クラスの頭に、アプリ全体で使用する頭字語または名前を付けることを好みます。

0
digitaldaemon

また、お使いの携帯電話の日付を確認してください!かつて5〜7日の差がありました。その日を修正してアプリを再インストールすると、これが修正されました!

0
Dhruv Kaushal

iNSTANCE_ID_EVENTをINSTANCEID_EVENTに変更するだけです。

0
kashyap k bandi

プロジェクトにさまざまなビルドバリアントがあり、次の問題があります。

送信元: https://firebase.google.com/docs/Android/setup#prerequisites

注:異なるパッケージ名が定義されたビルドバリアントが複数ある場合は、Firebaseコンソールで各アプリをプロジェクトに追加する必要があります。

Firebaseの「MyFirebaseInstanceIDService.Java」ファイルがパッケージ名ツリー「com.company」の直下にあることを確認してください

「com.company.services」のような個別のサブパッケージに入れないでください。これは、google-services.jsonが「com.company」ディレクトリの直下でファイルを検索するためです。

メタタグの下のマニフェストアプリケーションタグに以下を追加します(ある場合)。

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

トークンはpublic void onTokenRefresh()メソッドで取得されます

PS:プロジェクトコンソールから最新のgoogle-services.jsonをダウンロードして置き換えます。

0
Dhruv Kaushal

私は同じ問題を抱えており、デバイス上のアプリをアンインストールして再インストールすることにより、onTokenRefresh()が一度呼び出されました。つまり、頻繁に呼び出されるGCMから、実際にはトークンがないときに一度だけ呼び出されるように変更されたと思います。

0
Onno Eberhard

onTokenRefresh()は1回しか呼び出されません。アプリの初回インストール時に、他のアクティビティからトークンにアクセスする場合は、このメソッドを呼び出す必要があります。

FirebaseInstanceId.getInstanceId().getToken();
0
Mohd Qasim