Firebase onTokenRefresh() 未被调用
Firebase onTokenRefresh() is not called
在我的 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);
}
}
我遇到了和你一样的问题。我的错误如下:我将 <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>
而且它没有任何问题。
onTokenRefresh in FirebaseInstanceIdService is only called when a new token is generated. If your app was previously installed and generated a token then onTokenRefresh would not be called. Try uninstalling and reinstalling the app to force the generation of a new token, this would cause onTokenRefresh to be called.
还要确保您的 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>
FirebaseInstanceIdServiceclass
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 class.
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) {
}}
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
在onCreate
方法中删除令牌。
是的,这有时会发生。
请在任何地方调用以下方法获取您的 fcm id。
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
就我而言,我忘记在清单中添加互联网权限,
<uses-permission android:name="android.permission.INTERNET" />
希望大多数人不要犯这个错误。
尝试重新安装该应用程序,方法是先从您的设备或模拟器中将其卸载。然后它将生成一个新的令牌,因此将再次调用 onTokenRefresh()。
就我而言,我尝试了所有方法,但从未调用过 onTokenRefresh
。然后我更改 WiFi 并连接到不同的 网络 ,现在它工作了!!以前的 WiFi 具有良好的互联网连接,不知道为什么会这样。可能这可以帮助某人。
重新安装对我有用!
我曾遇到过,当您 运行 在无法连接互联网的设备上运行应用程序时,MyFirebaseInstanceIDService 不会被调用。这样就不会调用 onTokenRefresh()。因此,请确保您的设备在 运行 期间必须有互联网连接才能获取更新的 FirebaseToken。
同时卸载以前的应用程序 & Re-Install 它以获取更新的令牌。
注册令牌更改时间:
1) 应用程序删除实例 ID
2) 应用在新设备上恢复
3) 用户 uninstalls/reinstall 应用
4) 用户清空应用数据
我为此苦苦挣扎了一个多小时,然后我更改了以下代码,它突然起作用了。
这样处理您的 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);
您不必再依赖接收到的广播
确保您已添加
应用插件:'com.google.gms.google-services'
这是 app.gradle 文件的底部
我遇到了同样的问题。由于某种原因,我的设备(kitkat 4.4.2)
无法获取 onTokenRefresh()
。我的互联网连接非常完美,google 播放服务是最新的,并且满足了 firebase 工作的所有必要条件。我的代码在设备 5.0.0
及更高版本上完美运行。为了解决这个问题,我不得不将我的设备重置为出厂设置并且应用程序开始工作。我知道这是艰难的措施,但也许它可以帮助某人。一定是有什么问题或者和其他应用有冲突,导致onTokenRefresh()
没有被调用。祝你好运!
不调用未调用的 onTokenRefresh 方法有多种原因。我已经列出并一一提及。
请确保您已添加上网权限
检查您是否在项目的应用程序目录中添加了从 google 控制台生成的 google-services.json 文件
- 在你的模块 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文件
中添加播放服务class路径
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 refresh 在令牌刷新和首次安装应用程序时调用,因此请确保您已手动删除应用程序或清除数据
7) 确保您已经在服务中扩展了 FirebaseMessagingService class
[注意 :如果它只对特定版本不起作用,例如 android kitkat 版本然后尝试更改 fcm 版本。]
在我的 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);
}
}
我遇到了和你一样的问题。我的错误如下:我将 <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>
而且它没有任何问题。
onTokenRefresh in FirebaseInstanceIdService is only called when a new token is generated. If your app was previously installed and generated a token then onTokenRefresh would not be called. Try uninstalling and reinstalling the app to force the generation of a new token, this would cause onTokenRefresh to be called.
还要确保您的 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>
FirebaseInstanceIdServiceclass
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 class.
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) {
}}
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
在onCreate
方法中删除令牌。
是的,这有时会发生。
请在任何地方调用以下方法获取您的 fcm id。
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
就我而言,我忘记在清单中添加互联网权限,
<uses-permission android:name="android.permission.INTERNET" />
希望大多数人不要犯这个错误。
尝试重新安装该应用程序,方法是先从您的设备或模拟器中将其卸载。然后它将生成一个新的令牌,因此将再次调用 onTokenRefresh()。
就我而言,我尝试了所有方法,但从未调用过 onTokenRefresh
。然后我更改 WiFi 并连接到不同的 网络 ,现在它工作了!!以前的 WiFi 具有良好的互联网连接,不知道为什么会这样。可能这可以帮助某人。
重新安装对我有用!
我曾遇到过,当您 运行 在无法连接互联网的设备上运行应用程序时,MyFirebaseInstanceIDService 不会被调用。这样就不会调用 onTokenRefresh()。因此,请确保您的设备在 运行 期间必须有互联网连接才能获取更新的 FirebaseToken。
同时卸载以前的应用程序 & Re-Install 它以获取更新的令牌。 注册令牌更改时间:
1) 应用程序删除实例 ID
2) 应用在新设备上恢复
3) 用户 uninstalls/reinstall 应用
4) 用户清空应用数据
我为此苦苦挣扎了一个多小时,然后我更改了以下代码,它突然起作用了。
这样处理您的 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);
您不必再依赖接收到的广播
确保您已添加
应用插件:'com.google.gms.google-services'
这是 app.gradle 文件的底部
我遇到了同样的问题。由于某种原因,我的设备(kitkat 4.4.2)
无法获取 onTokenRefresh()
。我的互联网连接非常完美,google 播放服务是最新的,并且满足了 firebase 工作的所有必要条件。我的代码在设备 5.0.0
及更高版本上完美运行。为了解决这个问题,我不得不将我的设备重置为出厂设置并且应用程序开始工作。我知道这是艰难的措施,但也许它可以帮助某人。一定是有什么问题或者和其他应用有冲突,导致onTokenRefresh()
没有被调用。祝你好运!
不调用未调用的 onTokenRefresh 方法有多种原因。我已经列出并一一提及。
请确保您已添加上网权限
检查您是否在项目的应用程序目录中添加了从 google 控制台生成的 google-services.json 文件
- 在你的模块 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文件
中添加播放服务class路径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 refresh 在令牌刷新和首次安装应用程序时调用,因此请确保您已手动删除应用程序或清除数据
7) 确保您已经在服务中扩展了 FirebaseMessagingService class
[注意 :如果它只对特定版本不起作用,例如 android kitkat 版本然后尝试更改 fcm 版本。]