このガイドに従って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を含むベータ版をすでにリリースしているため、ベータ版のテスターはトピックにサブスクライブして、受信メッセージを復習できません。それで、どうすればそれを解決できますか?
FCMはGCMの代わりとして使用する必要があります。あなたの場合、マニフェストにFCMとGCMの両方のサービスがあるようです。 gcm.GcmServiceを削除してみてください。FirebaseInstanceIdを拡張するもののみを使用してください。
試行錯誤を繰り返した後、私の問題はアプリケーションタグにtools:node = "replace"が含まれていたことです...それを削除すると問題が解決しました
「Firebase Cloud Messaging」が求めているものは次のとおりです。
MyFirebaseInstanceIdServiceは「推奨」名です。私は個人的に、このような派生クラスの頭に、アプリ全体で使用する頭字語または名前を付けることを好みます。
また、お使いの携帯電話の日付を確認してください!かつて5〜7日の差がありました。その日を修正してアプリを再インストールすると、これが修正されました!
iNSTANCE_ID_EVENTをINSTANCEID_EVENTに変更するだけです。
プロジェクトにさまざまなビルドバリアントがあり、次の問題があります。
送信元: 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をダウンロードして置き換えます。
私は同じ問題を抱えており、デバイス上のアプリをアンインストールして再インストールすることにより、onTokenRefresh()
が一度呼び出されました。つまり、頻繁に呼び出されるGCMから、実際にはトークンがないときに一度だけ呼び出されるように変更されたと思います。
onTokenRefresh()
は1回しか呼び出されません。アプリの初回インストール時に、他のアクティビティからトークンにアクセスする場合は、このメソッドを呼び出す必要があります。
FirebaseInstanceId.getInstanceId().getToken();