在Android中获取FCM消息令牌的正确方法是啥?

Posted

技术标签:

【中文标题】在Android中获取FCM消息令牌的正确方法是啥?【英文标题】:What is the correct way to get the messaging token for FCM in Android?在Android中获取FCM消息令牌的正确方法是什么? 【发布时间】:2020-10-28 00:23:08 【问题描述】:

晚上好!

我希望将 Firebase 云消息传递添加到我的项目(android、Java)中。我已按照文档 https://firebase.google.com/docs/cloud-messaging/android/client#retrieve-the-current-registration-token 到发球台,但在检索消息令牌时仍然遇到问题。 Android Studio 声称 无法解析“FirebaseMessaging”中的方法“getToken”,因此无法编译。我假设我需要编写一个方法 getToken(),但找不到任何关于该方法应该做什么的文档。

这是我的课程,它按照文档描述扩展了 FirebaseMessagingService。

public class PushNotificationManager extends FirebaseMessagingService 

    public String MT;

    public PushNotificationManager() 
        FirebaseMessaging.getInstance().getToken()
                .addOnCompleteListener(new OnCompleteListener<String>() 
            @Override
            public void onComplete(@NonNull Task<String> task) 
                if (!task.isSuccessful()) 
                    System.out.println("Failed to get token");
                    return;
                
                MT = task.getResult();

            
        );
    

    @Override
    public void onNewToken(String token) 
        super.onNewToken(token);
        MT =  token;
        System.out.println("Refreshed token: " + token);
    

根据文档,我还覆盖了 onNewToken(),但我从来没有打印到日志中。

这是我添加到清单中的服务:

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

有许多关于这个主题的旧堆栈溢出文章,但没有一个有效,大多数都超过一年,并且使用现在已弃用的 InstanceID()。

有什么建议吗?感谢您的宝贵时间!

更新

感谢我在下面与 Doug 的对话,我已经解决了我的问题。首先,我在这个类中关注 onNewToken(),并在构造函数中删除了我的 getToken() 请求。

public class PushNotificationManager extends FirebaseMessagingService 

    public String MT;

    public PushNotificationManager() 

    

    @Override
    public void onNewToken(String token) 
        super.onNewToken(token);
        MT =  token;
        System.out.println("Refreshed token: " + token);
    

这与清单文件的更新相结合,会在应用启动时记录消息传递令牌完全重新安装后。现在,要将令牌存储在 Firebase RTB 中,我需要在初始化数据库后访问它。所以我在我的数据库类中添加了一个方法,在数据库初始化后调用。它看起来像这样:

    private void setMT()
    
        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 MT = (String) task.getResult().getToken();
                        System.out.println("Messaging token: "+MT);
//Now I can save it to the RTB
                    
                );
    

现在它开始工作了!谢谢你的帮助,道格!

【问题讨论】:

【参考方案1】:

如果您在FirebaseMessagingService 的注册子类中覆盖onNewToken,那么您不需要任何其他东西来获取令牌。您可以使用getToken 按需获取它,或者使用onNewToken 通过回调接收它。没有理由同时做这两件事(尤其是在同一个班级),除非你绝对知道你需要这样做。

如果您没有收到对 onNewToken 的回调,那么您可能没有完全 follow the instructions 并将您的 FirebaseMessagingService 子类添加为您的清单中的 Android 服务。

【讨论】:

谢谢 Doug,我确实用新服务更新了我的清单,并将用新服务更新我的问题,也许我有一个错误。 你仍然不应该在同一个课程中同时使用这两种技术。这似乎没有帮助。专注于其中一个。 谢谢!我删除了 getToken() 并且正在运行一个空的构造函数。现在,当我卸载并重新安装该应用程序时,我会收到带有消息传递令牌的日志。我现在的问题是这发生在我的任何其他代码之前,所以我无法在 onNewToken 方法中将其写入数据库,因为我的数据库尚未初始化。我想为这个用户将混乱令牌添加到我的 firebase 数据库中,以便我可以将它与云功能一起使用。我如何访问它?

以上是关于在Android中获取FCM消息令牌的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android Firebase 云消息传递令牌 (FCM) 令牌太短/不完整

在 FCM(Firebase 云消息传递)中,在通知中包含令牌是不是安全?

处理 FCM 设备组的刷新令牌

Firebase 中的 FCM 令牌是啥?

为啥不获取 Android Firebase FCM 注册令牌?

在 React-Native 中获取 FCM 令牌