GCM到FCM迁移。 Firebase无法正常工作。未注册的注册令牌

时间:2017-04-10 15:16:53

标签: android firebase firebase-cloud-messaging dagger

我尝试从GCM迁移到FCM。我读了这个guide。我从firebase quikstart app克隆代码一切都很好。但是,如果我尝试在我的应用程序中实现,我有一个问题。

我尝试从firebase控制台发送几条消息,状态其中一些“已完成”,但我的应用程序中没有收到任何内容...排除我一直收到的前几条消息:未注册的注册令牌。为了发送我使用来自FirebaseInstanceId.getInstance()的令牌.getToken() firebase dashboard

我不明白这是问题。

我的InstanceIdService:

public class MyInstanceIDListenerService
        extends FirebaseInstanceIdService {

    @Inject
    FCMTokenProvider FCMTokenProvider;

    @Override
    public void onCreate() {
        super.onCreate();
        MyApplication application = (MyApplication)getApplication();
        application.getComponent().inject(this);
    }

    @Override
    public void onTokenRefresh() {
    String newToken = FirebaseInstanceId.getInstance().getToken();
    FCMTokenProvider.initialize(getApplicationContext());
    }
}

我的FirebaseMessagingService:

@EService
public class FcmMessageListenerService
    extends FirebaseMessagingService {

@Inject
MessageDispatcher messageDispatcher;

@Override
public void onCreate() {
    super.onCreate();
    MyApplication application = (MyApplication)getApplication();
    application.getComponent().inject(this);
}



@Override
public void onMessageReceived(RemoteMessage message){
            MyApplication application = (MyApplication)getApplication();


    if(application == null)
        return;

    if (message == null)
        return;

    String from = message.getFrom();

    Map<String, String> stringData = message.getData();
    Bundle data = new Bundle();
    for(String key: stringData.keySet()){
        data.putString(key, stringData.get(key));
    }
    messageDispatcher.handleMessage(from, data,application.getCurrentActivity());
}
}

我的清单的一部分:

<application>
...
<service
   android:name=".infrastructure.fcm.services.FcmMessageListenerService_">
     <intent-filter>
       <action android:name="com.google.firebase.MESSAGING_EVENT"/>
     </intent-filter>
</service>
<service
   android:name=".infrastructure.fcm.services.MyInstanceIDListenerService">
  <intent-filter>
    <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
  </intent-filter>
</service>
...
</application>

我的build.gradle的一部分:

def GcmVersion = '10.2.1'
...
compile "com.google.android.gms:play-services-base:$GcmVersion"
compile "com.google.android.gms:play-services-identity:$GcmVersion"
compile "com.google.android.gms:play-services-maps:$GcmVersion"
compile "com.google.android.gms:play-services-location:$GcmVersion"
compile "com.google.android.gms:play-services-wallet:$GcmVersion"
compile "com.google.android.gms:play-services-ads:$GcmVersion"
compile "com.google.android.gms:play-services-auth:$GcmVersion"
compile "com.google.android.gms:play-services-cast-framework:$GcmVersion"
compile "com.google.android.gms:play-services-vision:$GcmVersion"
compile "com.google.android.gms:play-services-places:$GcmVersion"

compile "com.google.firebase:firebase-core:$GcmVersion"
compile "com.google.firebase:firebase-appindexing:$GcmVersion"
compile "com.google.firebase:firebase-messaging:$GcmVersion"
...
apply plugin: 'com.google.gms.google-services'

旧版Dagger 2和Firebase出现了一个问题。我刚刚将Dagger 2的版本更新为2.9

我将不胜感激任何帮助。

更新

我重命名并更新了GCMTokenProvider:

@Singleton
public class FCMTokenProvider {

    private static final String TAG = "FCMTokenProvider";

    private String fcmToken;

    @Inject
    public FCMTokenProvider(){

    }

    public void initialize(Context applicationContext){
            this.fcmToken = FirebaseInstanceId.getInstance().getToken();
            if(!Strings.isNullOrEmpty(fcmToken)){
                EventBus.getDefault().post(new FcmToken(fcmToken));
            }

            Log.d(TAG, "run: fcm token: "+ fcmToken);
    }

    public String getFcmToken() {
        return fcmToken;
    }

}
每次应用程序启动时都会调用

initialize()。

1 个答案:

答案 0 :(得分:0)

我发现了自己的错误。 一开始我打电话给

时收到了错误
FirebaseInstanceId.getInstance().getToken():

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process it.clipcall.another. Make sure to call FirebaseApp.initializeApp(Context) first.
                                                                   at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
                                                                   at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)

我通过添加onCreate Application exetended class

来修复它
FirebaseApp.initializeApp(Context);

这是一个很大的错误!

我收到了一个令牌,但是当我在控制台中发送第一条消息时,我的状态为“已完成”,但在应用程序中没有收到任何消息。发送以下消息时,令牌未注册。我无法理解这是怎么回事。

现在我已经从我的应用程序中删除了所有库,现在我没有收到错误“java.lang.IllegalStateException:默认FirebaseApp未在...中初始化”我的应用程序正常工作,直到我开始添加库。 我发现支持版本和firebase lib版本之间存在不兼容性。

现在我用

gradle -q app:dependencies --configuration compile 

用于查找隐藏支持依赖项并排除模块或组支持。