Firebase облачных сообщений Android push-уведомление не работает - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть приложение для Android, которое отправляет push-уведомления пользователям. Когда пользователь получает уведомление, пользователь нажимает на уведомление, и приложение открывается, а URL-адрес открывается в веб-представлении Android.

но мое приложение не получает никаких уведомлений. вот код

    public class MainActivity extends AppCompatActivity {
         private WebView webView;
         private ProgressDialog dialog;
         private BroadcastReceiver mRegistrationBroadcastReciever;
         private final String CHANNEL_ID="notificcation";        
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_main);
             webView=(WebView)findViewById(R.id.webView);
             webView.getSettings().setJavaScriptEnabled(true);
             webView.setWebChromeClient(new WebChromeClient());
             webView.setWebViewClient(new WebViewClient(){
                  @Override
                  public void onPageFinished(WebView view, String url) {
                      if(dialog.isShowing())
                         dialog.dismiss();
                  }
             });     
             mRegistrationBroadcastReciever=new BroadcastReceiver() {
                  @Override
                  public void onReceive(Context context, Intent intent) {
                      if(intent.getAction().equals(Config.STR_PUSH)){
                          String message=intent.getStringExtra(Config.STR_MESSAGE);
                          showNotification("MSG",message);
                      }    
                  }
             };
             onNewIntent(getIntent());
         }
         @Override
         protected void onNewIntent(Intent intent) {
              dialog=new ProgressDialog(this);
              if(intent.getStringExtra(Config.STR_KEY)!=null){
                  dialog.show();
                  dialog.setMessage("Please Wait");
                  webView.loadUrl(intent.getStringExtra(Config.STR_KEY));    
              }
         }    
         private void showNotification(String title, String message) {
              Intent intent =new Intent(getBaseContext(),MainActivity.class);
              intent.putExtra(Config.STR_KEY,message);
              intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
              PendingIntent contentIntent=PendingIntent.getActivity(getBaseContext(),0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
              NotificationCompat.Builder builder=new NotificationCompat.Builder(getBaseContext(),CHANNEL_ID);
              builder.setAutoCancel(true)
              .setWhen(System.currentTimeMillis())
              .setDefaults(Notification.DEFAULT_ALL)
              .setSmallIcon(R.mipmap.ic_launcher_round)
              .setContentTitle(title)
              .setContentText(message)
              .setContentIntent(contentIntent);

              NotificationManager notificationManager = (NotificationManager)getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
              notificationManager.notify(1,builder.build());
         }
         @Override
         protected void onPause() {
                LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReciever);
              super.onPause();
         }
         @Override
         protected void onResume() {
              super.onResume();
              LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReciever,new IntentFilter("registration Complete"));
              LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReciever,new IntentFilter(Config.STR_PUSH));
         }
    }

Служба FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService{
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
       handleMessage(remoteMessage.getData().get(Config.STR_KEY));

    }

    private void handleMessage(String message) {
        Intent pushNotification=new Intent(Config.STR_PUSH);
        pushNotification.putExtra(Config.STR_MESSAGE,message);
        LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);


    }

}

Класс инстанса Firebase

public class MyFirebaseIdService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String token = FirebaseInstanceId.getInstance().getToken();
        sendToServer(token);

    }

    private void sendToServer(String token) {


    }
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Сообщения, отправленные через консоль Firebase, обрабатываются как notification сообщения. Из вашего кода вы обрабатываете только data полезные нагрузки сообщений (remoteMessage.getData(), которые, вероятно, равны нулю. Вы можете включить полезную нагрузку data сообщений вместе с содержимым сообщения notification, добавив Advanced Option через консоль Firebase.

Кроме того, FirebaseInstanceIdService устарела. Продолжайте использовать onNewToken() в FirebaseMessagingService.

0 голосов
/ 07 сентября 2018

Сначала вы используете LocalBroadcastManager, который зарегистрирован только в том случае, если ваша основная активность в настоящее время находится на переднем плане.

Во-вторых, какое сообщение вы отправляете? Это могут быть данные или уведомления сообщения. При использовании data я бы избавился от LocalBroadcastManager и объявил бы метод showNotification в MyFirebaseMessagingService, чтобы вы могли напрямую отобразить уведомление оттуда.

Если вы используете уведомления сообщения. Если ваше приложение находится в фоновом режиме, push-уведомление будет обрабатываться в системном трее, а onMessageReceived будет вызываться только в том случае, если ваше приложение находится на переднем плане.

Взгляните на документы здесь: https://firebase.google.com/docs/cloud-messaging/android/receive

Наиболее значимая часть:

onMessageReceived предоставляется для большинства типов сообщений со следующими исключениями:

  • Уведомления доставляются, когда ваше приложение находится в фоновом режиме . В этом случае уведомление доставляется в системный трей устройства. При нажатии пользователем на уведомление по умолчанию открывается панель запуска приложения.
  • Сообщения с уведомлением и полезной нагрузкой данных, как фон, так и передний план . В этом случае уведомление доставляется в системный трей устройства, а полезная нагрузка данных доставляется в дополнениях к назначению вашего средства запуска.
...