从GCM迁移到FCM android项目后,令牌生成不起作用 [英] Token generation not working call after migrating from GCM to FCM android project

查看:141
本文介绍了从GCM迁移到FCM android项目后,令牌生成不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将一个项目从GCM转换为FCM,但 onTokenRefresh()函数未被调用。

我遵循以下链接:
https://developers.google.com/cloud-messaging/ android / android-migrate-fcm



我已完成后续步骤




  • 添加Firebase项目并添加带SHA1键的应用程序
  • 从我的android项目中删除所有GCM代码
  • 添加FCM代码

  • FCM代码

    在manifest.xml中

     < service android:name =。Commonclass.MyFirebaseMessagingService> ; 
    < intent-filter>
    < / intent-filter>
    < / service>
    < service android:name =。Commonclass.MyFirebaseInstanceIDService>
    < intent-filter>
    < / intent-filter>
    < / service>

    创建两个java文件
    MyFirebaseInstanceIDService.java

      public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG =MyFirebaseIIDService;

    @Override
    public void onTokenRefresh(){
    Log.d(TAG,Refreshed token start);
    String refreshedToken = FirebaseInstanceId.getInstance()。getToken();
    Log.d(TAG,刷新标记:+ refreshedToken);
    GlobalClass.strDeviceToken = refreshedToken;
    Log.e(token,GlobalClass.strDeviceToken);
    Log.d(TAG,刷新令牌结束);
    storeToken(refreshedToken);


    $ b private void storeToken(String token){
    //在共享偏好设置上保存标记

    SharedPreferences sharedPreferences = getSharedPreferences( GlobalClass.SHARED_PREF_NAME,Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(GlobalClass.prefFCMToen,token);
    editor.apply();
    }
    }

    MyFirebaseMessagingService.java

      public class MyFirebaseMessagingService继承了FirebaseMessagingService {
    private static final String TAG =MyFirebaseMsgService;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage){
    if(remoteMessage.getData()。size()> 0){
    // Log。 e(TAG,Data Payload:+ remoteMessage.getData()。toString());
    尝试{
    Map< String,String> params = remoteMessage.getData();
    JSONObject json = new JSONObject(params);

    } catch(Exception e){
    Log.e(TAG,Exception:+ e.getMessage());
    }
    }
    }
    }

    I遵循此Google指南
    https:// firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId
    ,每次我重新安装应用程序但不能调用 onTokenRefresh() onTokenRefresh()方法并不一定每次都会被调用。应用程序启动或新安装。它只在某些情况下触发(请参阅我的答案此处)。



    实现看起来正确。为了获得当前令牌,您必须首先在类似于MainActivity的地方调用 getToken()

    getToken()方法可以立即返回当前标记 null。如果为空,则意味着FCM服务器尚未完成生成或将令牌发送回客户端,在这种情况下, onTokenRefresh()会在完成时触发。 p>

    I have converted a project from GCM to FCM but onTokenRefresh() function not call.

    I have followed this link : https://developers.google.com/cloud-messaging/android/android-migrate-fcm

    I have completed follow step

    1. Add Firebase project and add application with SHA1 key
    2. Remove all code of GCM from my android project
    3. Add FCM code

    FCM Code:

    In manifest.xml

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

    Create two java file MyFirebaseInstanceIDService.java

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    
        private static final String TAG = "MyFirebaseIIDService";
    
        @Override
        public void onTokenRefresh() {
            Log.d(TAG, "Refreshed token start");
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d(TAG, "Refreshed token: " + refreshedToken);
            GlobalClass.strDeviceToken = refreshedToken;
            Log.e("token",GlobalClass.strDeviceToken);
            Log.d(TAG, "Refreshed token end");
            storeToken(refreshedToken);
        }
    
    
        private void storeToken(String token) {
            //saving the token on shared preferences
    
            SharedPreferences sharedPreferences = getSharedPreferences(GlobalClass.SHARED_PREF_NAME, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString(GlobalClass.prefFCMToen, token);
            editor.apply();
        }
    }
    

    MyFirebaseMessagingService.java

    public class MyFirebaseMessagingService extends FirebaseMessagingService {
        private static final String TAG = "MyFirebaseMsgService";
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getData().size() > 0) {
            //Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());
            try {
                Map<String, String> params = remoteMessage.getData();
                JSONObject json = new JSONObject(params);
    
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
       }
    }
    

    I follow this google guidelines https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId every time I reinstall application but not call onTokenRefresh().

    解决方案

    The onTokenRefresh() method doesn't necessarily get called every time the app starts or if it is newly installed. It only triggers on some scenarios (see my answer here).

    The implementation looks correct. In order to get the current token, you must first call getToken() somewhere similar to a MainActivity.

    The getToken() method can immediately return the current token or null. If its null, it means that the FCM server is not yet finished generating or sending the token back to the client, in which case onTokenRefresh() would trigger upon completion.

    这篇关于从GCM迁移到FCM android项目后,令牌生成不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆