不调用Firebase onTokenRefresh()

nat*_*iyu 69 android firebase firebase-cloud-messaging firebase-notifications

在我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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Sag*_*ane 102

FirebaseInstanceIdService中的onTokenRefresh仅在生成新令牌时调用.如果您的应用程序先前已安装并生成令牌,则不会调用onTokenRefresh.尝试卸载并重新安装应用程序以强制生成新令牌,这将导致调用onTokenRefresh.

还要确保在AndroidManifest.xml中正确定义了FirebaseInstanceIdService

在你的清单文件中.

 <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>
Run Code Online (Sandbox Code Playgroud)

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.
}}
Run Code Online (Sandbox Code Playgroud)

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

}}
Run Code Online (Sandbox Code Playgroud)

  • 为什么要将令牌保存到共享首选项 - 如果您可以调用[FirebaseInstanceId.getInstance().getToken()](https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId)在任何时候获得它的价值? (2认同)

vip*_*zer 23

我和你一样有同样的问题.我的错误如下:我将<service>标签放在<application>AndroidManifest.xml文件中的标签之外.

现在我看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

它没有任何问题.

  • 这么多人犯了这个错误怎么样? (4认同)

Sur*_*r D 15

是的,有时会发生这种情况.

如果您想获得fcm id,请调用以下方法.

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

  • 好的.在几次重新安装之后,令牌停止刷新,但直接getToken确实返回了正确的令牌. (2认同)

Sre*_*dhu 13

在我的情况下,我忘了在清单中添加互联网权限,

<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

希望大多数人不会犯这个错误.


far*_*ruk 13

尝试重新安装该应用,首先从您的设备或模拟器中卸载它.然后它将生成一个新令牌,因此将再次调用onTokenRefresh().