Я пытаюсь перенести приложение-клиент Android из облачных сообщений Google в FireBase Cloud Messaging. Я строго следовал за official tutorial, но не удалось - onMessageReceived()
метод не вызывается, когда приложение на переднем плане.Миграция GCM в FirebaseCM: onMessageReceived() не вызывается на переднем плане
Итак, вот фрагменты кода, которые я коснулся.
build.gradle (уровень проекта)
dependencies {
//other stuff
classpath 'com.google.gms:google-services:3.0.0'
}
build.gradle (уровень приложений)
apply plugin: 'com.google.gms.google-services' //this line in the bottom
и
dependencies {
//other stuff here
compile 'com.google.firebase:firebase-messaging:9.0.0'
}
AndroidManifest.xml
<service android:name=".service.FirebaseService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
и
<service
android:name=".service.MyInstanceIDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
и
<service
android:name=".service.RegistrationIntentService"
android:exported="false" />
, как Чайлдс из <application>
тега.
MyInstanceIDListenerService.java
public class MyInstanceIDListenerService extends FirebaseInstanceIdService {
final String TAG = "Firebase instance id";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
FirebaseService.java
public class FirebaseService extends FirebaseMessagingService {
//OtherStuff
@Override
public void onMessageReceived(RemoteMessage message){
String from = message.getFrom();
Map data = message.getData();
Log.d(TAG, "Message: " + from); //Never appears in logcat
//other stuff
}
}
RegistrationIntentService
public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
synchronized (TAG) {
String token = FirebaseInstanceId.getInstance().getToken();
Log.i(TAG, "GCM Registration Token: " + token);//This works fine
//and shows this line - 12-19 17:59:33.295 3146-5386/ru.bpc.mobilebank.bpc I/RegIntentService: GCM Registration Token: *some_token*
sendRegistrationToServer(token);
}
} catch (Exception e) {
Log.d(TAG, "Failed to complete token refresh", e);
}
}
private void sendRegistrationToServer(String token) {
Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
Пожалуйста, сообщите, если я сделал что-то неправильно и почему регистрация, похоже, выполнена правильно, но метод onMessageReceived()
никогда не вызывается, даже если приложение находится на переднем плане. Заранее спасибо.
P.S. Кстати, добавляет ли ключи SHA-1 в консоли Firebase? может быть, это может вызвать проблему? Но Firebase говорит, что это действие является необязательным.
Вы добавили файл Google-services.json в вашем приложение? Возможно, вам нужно выполнить дополнительную настройку в консоли или конфигурации Firebase. Проверьте https://firebase.google.com/docs/android/setup, если у вас все правильно настроено. – MatPag
Вы, конечно, добавили google-services.json. Вы, спасибо за совет, я пойду и проведу установку, проблема может быть там. –
Кстати, нужно добавить ключи SHA-1 в консоль Firebase? может быть, это может вызвать проблему? Но Firebase говорит, что это необязательно. –