onNewToken()未称为

时间:2019-02-01 08:09:47

标签: android firebase push-notification

过去几天,我试图使FCM在我的应用程序中运行,我发现不赞成onTokenRefreshed()函数和FirebaseInstanceIdService。 因此,我在网上关注了一些Firebase文档和教程,但似乎没有一个对我有用。 我的MyFirebaseMessagingService类是:

package com.example.android.aln4.Classes;

import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMessaging";

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.d(TAG,"Refreshed token: "+token);
    }
}

我的清单包含以下代码:

<service android:name=".Classes.MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

此外,我所有与firebae相关的实现都是最新的,如下所示:

  //Firebase
    implementation 'com.google.firebase:firebase-crash:16.2.1'
    implementation 'com.firebase:firebase-client-android:2.5.2'
    implementation 'com.google.firebase:firebase-core:16.0.6'
    implementation 'com.google.firebase:firebase-database:16.0.6'
    implementation 'com.firebase:firebase-client-android:2.5.2'
    implementation 'com.firebaseui:firebase-ui-database:2.1.1'
    implementation 'com.google.firebase:firebase-storage:16.0.5'
    implementation 'com.google.firebase:firebase-firestore:18.0.0'
    implementation 'com.google.firebase:firebase-messaging:17.3.4'

一般而言,我的问题是,无论何时运行应用程序,无论是在卸载和安装之后还是正常运行时,都不会调用onNewToken()函数,或者至少我看不到它在Logcat中。 任何形式的帮助都可以申请:)

7 个答案:

答案 0 :(得分:2)

onNewToken()仅在生成新令牌或现有令牌已更新时被调用。

您可以添加以下代码,然后在应用中的任何位置调用以随时获取令牌。

    FirebaseInstanceId.getInstance().getInstanceId()
    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                Log.w(TAG, "getInstanceId failed", task.getException());
                return;
            }

            // Get new Instance ID token
            String token = task.getResult().getToken();


        }
    });

答案 1 :(得分:1)

生成令牌时会调用

onNewToken 方法,您应该在活动中检索该令牌。

将此添加到您的活动中:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(SplashActivity.this, new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String token = instanceIdResult.getToken();
            Log.i("FCM Token", token);
            saveToken(token);
        }
    });

答案 2 :(得分:1)

2020年12月更新:使用新的Firebase SDK(21.0.0),您可以在范围内通过FirebaseInstallations.getInstance()获得令牌:

FirebaseInstallations.getInstance().getToken(false).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
          @Override
          public void onComplete(@NonNull Task<InstallationTokenResult> task) {
              if(!task.isSuccessful()){
                  return;
              }
              // Get new Instance ID token
              String token = task.getResult().getToken();

          }
      });

答案 3 :(得分:1)

使用 android studio 的 firebase 助手工具将您的应用程序连接到 FCM 后,在您的 MainAcitivity 类上使用此代码来检索 firebase 云消息传递令牌:(此代码对我有用强>)

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Toast.makeText(this, "${task.exception}", Toast.LENGTH_LONG).show()
                return@OnCompleteListener
            }

            // Get FCM registration token
            val token = task.result
            if (token != null) {
                Toast.makeText(this, token, Toast.LENGTH_LONG).show()
            }
        })

答案 4 :(得分:0)

使用此:

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

答案 5 :(得分:0)

您只需要onNewToken()来通知您的应用程序它需要再次发送令牌。

您可以在应用的某个入口点执行此操作:

private void doPushCheck() throws ExecutionException, InterruptedException {
    if (isPushTokenAlreadySent()) {
        return;
    }
    Task<InstanceIdResult> instanceId = FirebaseInstanceId.getInstance().getInstanceId();
    Tasks.await(instanceId);
    InstanceIdResult result = instanceId.getResult();
    if (result != null) {
        String sPushToken = result.getToken();
        if (!TextUtils.isEmpty(sPushToken)) {
            [send token to your backend and verify your server response]
            setPushTokenSent(true);
        }
    }
}

在on onNewToken()方法覆盖上,您可以简单地执行以下操作:

@Override
public void onNewToken(@NonNull String sPushToken) {
    setPushTokenSent(false);
}

方法isPushTokenAlreadySent()和setPushTokenSent()可能是您持久保存数据的最佳方式,例如,使用SharedPreferences:

private boolean isPushTokenAlreadySent() {
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("push_token", Context.MODE_PRIVATE);
    return preferences.getBoolean("registered", false);
}

private void setPushTokenSent(boolean bSent) {
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("push_token", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    preferences.getBoolean("registered", bSent);
    editor.apply();
}

答案 6 :(得分:0)

接收这样的令牌(Kotlin):

FirebaseMessaging.getInstance().token.result?.let{ Log.e(TAG, "onCreate: $it")}