【问题标题】:onNewToken() is not called未调用 onNewToken()
【发布时间】:2019-06-25 18:51:23
【问题描述】:

在过去的几天里,我试图让 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 中。 任何形式的帮助都会得到满足:)

【问题讨论】:

  • 没关系,不必调用。如果没有 - 您可以获得当前令牌。
  • @VladyslavMatviienko 是的,我忘了说,onMessageRecieved 也不起作用(或未被调用)
  • 然后可能您将消息发送到错误的令牌。或者也许是别的东西。你必须检查一切,没有人可以代替你做它
  • @AdiHarel 你能解决这个问题吗,我们面临着完全相同的问题,并且自 2 天以来无法找到解决此问题的方法。如果您能够解决,请告诉我们解决方案。任何帮助将不胜感激..

标签: android firebase push-notification


【解决方案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);
        }
    });

【讨论】:

  • 谢谢!所以这个方法现在也被弃用了。您是否碰巧知道目前接受的访问方法是什么?谷歌似乎像创建它们一样快地贬低这些方法。
  • onNewToken 在为默认 Firebase 项目生成新令牌时调用。这是在首次生成令牌时在应用安装后调用的,如果令牌更改,则会再次调用。 firebase.google.com/docs/reference/android/com/google/firebase/…
【解决方案2】:

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】:

    使用这个:

    FirebaseMessaging.getInstance().setAutoInitEnabled(true);
    

    【讨论】:

    • 文档说这是默认启用的。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      使用 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()
                  }
              })
      

      【讨论】:

        【解决方案6】:

        接收这样的令牌(Kotlin):

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-17
            • 2021-11-18
            • 2019-01-23
            • 1970-01-01
            • 2020-06-07
            • 2020-11-23
            • 2019-08-31
            • 2022-01-22
            相关资源
            最近更新 更多