android 未调用onNewToken()

wpx232ag  于 2022-12-09  发布在  Android
关注(0)|答案(7)|浏览(149)

在过去的几天里,我试图让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中看不到它。任何形式的帮助都是非常感谢的:)

htrmnn0y

htrmnn0y1#

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);
        }
    });
92vpleto

92vpleto2#

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();

          }
      });

编辑:2022年12月更新:使用新的Firebase SDK(23.1.0):

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

qyzbxkaa3#

请使用此选项:

FirebaseMessaging.getInstance().setAutoInitEnabled(true);
wnvonmuf

wnvonmuf4#

使用android studio的firebase助手工具将您的应用连接到FCM后,在MainActivity类上使用以下代码来检索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()
            }
        })
ovfsdjhp

ovfsdjhp5#

仅当生成新令牌或更新现有令牌时,才会调用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();

        }
    });
bwitn5fc

bwitn5fc6#

接收类似这样的令牌(Kotlin):

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

ax6ht2ek7#

您只需要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);
        }
    }
}

在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();
}

相关问题