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); } }
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) { }}
我有和你一样的问题。 我的错误是:我把<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>
它工作没有任何问题。
是的,这可能会发生一些时间。
无论您想获得您的fcm id,请致电以下方法。
try { String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d("Firbase id login", "Refreshed token: " + refreshedToken); } catch (Exception e) { e.printStackTrace(); }
在我的情况下,我忘记了在清单中添加Internet权限,
<uses-permission android:name="android.permission.INTERNET" />
希望大多数人不会犯这个错误。
尝试重新安装应用程序,先从您的设备或模拟器中卸载它。 然后它会生成一个新的标记,因此onTokenRefresh()将再次被调用。
try { FirebaseInstanceId.getInstance().deleteInstanceId(); } catch (IOException e) { e.printStackTrace(); }
在onCreate
方法中删除令牌。
在我的情况下,我尝试了一切,但onTokenRefresh
从未被调用。 然后我改变我的WiFi ,我连接到不同的networking ,现在它的工作! 以前的WiFi具有良好的互联网连接,不知道为什么发生。 可能是这可以帮助别人。
重新安装为我做了诡计!