48

私のログの私のMainActivityに、FirebaseInstanceId.getInstance().getToken()を使ってトークンが表示され、生成されたトークンが表示されます。しかし、私のMyFirebaseInstanceIDServiceのように、FirebaseInstanceIdServiceまで伸びていて、onTokenRefresh()は呼び出されていないようです。この関数では、トークンはここで最初に生成されたと言われました。私はと呼ぶ必要がありました。なぜそれがonTokenRefresh()に入っていないのかを知ろうとしています。Fireベースの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); 
    } 
} 
+0

[呼び出されるFirebase FCM force onTokenRefresh()]の複製の可能性があります(http://stackoverflow.com/questions/37454501/firebase-fcm-force-ontokenrefresh-to-be-called) – Machado

+0

質問を完全にお読みください。この質問はあなたが言及した質問の重複ではありません。 @マチャド –

答えて

75

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クラス。トークンを削除するonCreate方法で

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) { 

}} 
+0

ドキュメントが混乱しているようです(https://firebase.google.com/docs/cloud-messaging/android/client)、次の場合に登録トークンが変更される可能性があります:アプリケーションがインスタンスIDを削除し、FirebaseInstanceId.getInstance ().deleteInstanceId();私は新しいトークンが生成されることを期待していましたが、この場合実際には何も起こらず、onTokenRefreshは決して呼び出されません。 – WenChao

+1

トークンを共有設定に保存する理由 - [FirebaseInstanceId.getInstance().getToken()](https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId)を呼び出すことができる場合は、 )いつでもその価値を得ることができますか? –

+0

@WenChaoあなたが 'InstanceID.getInstance(this).deleteInstanceID()'で再生サービスのInstanceIDを呼び出し、バックグラウンドスレッドから呼び出すことができます。新しいトークン – Salis

20

です。私の間違いは次のとおりです:<service>タグをAndroidManifest.xmlファイルの<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> 

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

+1

クレジットはこのスレッドに行く:http://stackoverflow.com/questions/37351354/firebase-cloud-messaging-notification-not-received-by-device – viplezer

+0

素晴らしい答え...これは戻ってくるFacebookのIDです?.......私はそれをしようとしていると私は非常に大きなトークンを得ている – Juan

+0

Facebook?ファイアベース? FirebaseInstanceIDServiceサブクラスのonTokenRefreshメソッドでFirebase Cloud Messagingのトークンを取得します。はい、長い文字列です。トークンの長さは152文字です。 – viplezer

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

+0

あなたはそれを試しましたか?それはメインスレッド例外のネットワークを投げるでしょう... –

+0

'スレッドt =新しいスレッド()'は 'MAIN_THREAD例外 'を解決します – Pierre

11

はいこれは何度か起こる可能性があります。

fcm idを取得したい場合は、次の方法を呼び出してください。私の場合は

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

いいです。いくつかの再インストールの後で、更新するトークンは停止しますが、直接getTokenは正しいトークンを返しました。 –

11

私は、ほとんどの人はこの間違いをすることはありません

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

ホープ、マニフェストにインターネットアクセス許可を追加するのを忘れ。

10

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

1

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

1

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

関連する問題