2

Я пытаюсь перенести приложение-клиент 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 говорит, что это действие является необязательным.

+1

Вы добавили файл Google-services.json в вашем приложение? Возможно, вам нужно выполнить дополнительную настройку в консоли или конфигурации Firebase. Проверьте https://firebase.google.com/docs/android/setup, если у вас все правильно настроено. – MatPag

+0

Вы, конечно, добавили google-services.json. Вы, спасибо за совет, я пойду и проведу установку, проблема может быть там. –

+0

Кстати, нужно добавить ключи SHA-1 в консоль Firebase? может быть, это может вызвать проблему? Но Firebase говорит, что это необязательно. –

ответ

1

, если вы используете ТСМ, то вы должны заменить этот

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

в

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

вашей служба не зарегистрированы должным образом ..

+1

Как этот парень опубликовал, класс @ dmitry-smolyaninov теперь называется FirebaseService, а не GcmService, служба не зарегистрирована должным образом в AndroidManifest.xml. Upvoted. –

+0

О, извините. Я просто забыл заменить все оригинальные имена классов. Я переименовал ссылки и названия некоторых классов, о которых идет речь, чтобы сделать их более ясными и разумными. В классах проектов по-прежнему есть имена GSM, но реализуются функциональные возможности FCM. Я просто не делаю рефакторинг, пока не решу эту проблему. –

Смежные вопросы