Firebase onMessageReceived arka planda uygulama çağrılmadı


233

Firebase ile çalışıyorum ve uygulama arka plandayken sunucumdan uygulamama bildirim göndermeyi test ediyorum. Bildirim başarıyla gönderilir, hatta cihazın bildirim merkezinde görünür, ancak bildirim göründüğünde veya tıklasam bile, FCMessagingService'imdeki onMessageReceived yöntemi hiçbir zaman çağrılmaz.

Uygulamam ön planda iken bunu test ettiğimde, onMessageReceived yöntemi çağrıldı ve her şey iyi çalıştı. Uygulama arka planda çalışırken sorun oluşur.

Bu amaçlanan davranış mı, yoksa bunu çözebilmemin bir yolu var mı?

İşte benim FBMessagingService:

import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class FBMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.i("PVL", "MESSAGE RECEIVED!!");
        if (remoteMessage.getNotification().getBody() != null) {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
        } else {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
        }
    }
}

Json gövdesine ek olarak, onTokenRefresh kodunuz nerede ? Android kurulumunu tamamladınız mı ?
Kato

4
Bildirimin json gövdesi ne demek? Ayrıca, onTokenRefresh kodum FirebaseInstanceID hizmetimin içinde.
Cyogenos

Gönderdiğiniz örnek yükü gönderebilir misiniz?
AL.


Bu ipliği de kontrol edebilirsiniz stackoverflow.com/questions/39046270/…
Md. Sajedul Karim

Yanıtlar:


144

Bu, amaçlandığı gibi çalışıyor, bildirim mesajları yalnızca uygulamanız ön planda olduğunda onMessageReceived geri aramanıza gönderilir. Uygulamanız arka planda veya kapalıysa, bildirim merkezinde bir bildirim mesajı gösterilir ve bu iletideki tüm veriler , kullanıcının bildirime hafifçe vurması sonucunda başlatılan amaca iletilir .

Bildirim kullanıcı tarafından dokunduğunda başlatılması gereken amacı belirtmek için bir click_action belirtebilirsiniz. Hiçbir click_action belirtilmezse ana etkinlik kullanılır.

Amaç başlatıldığında,

getIntent().getExtras();

bildirim mesajı ile birlikte gönderilen tüm verileri içeren bir Kümeyi almak için.

Bildirim mesajı hakkında daha fazla bilgi için dokümanlara bakın .


6
click_actionFirebase Bildirim Konsolu'nu ne zaman kullanacağımı ayarlamanın bir yolu var mı ?
Nii Laryea

6
tamam, ama uygulama öldürülürse (ön plan veya arka plan yok)?
michalu

3
Ancak kullanıcı atma bildirimini nasıl devre dışı bırakabilirim? Çünkü kullanıcı elinden çıkarsa, tüm verilerin atlanacağı anlamına gelir ... Değil mi?
Aleksey Timoshchenko

4
Doğru! Bu nedenle Android'e bildirim mesajları gönderirken, eşlik eden veriler bildirim deneyimini geliştiren veriler olmalıdır. Uygulama açısından kritik veriler olmamalı, kullanıcı bildirimi kapatsa bile uygulamanın ihtiyaç duyduğu veriler için veri mesajlarını kullanmalıdır.
Arthur Thompson

3
Bu tamamen doğru değil. İleti yalnızca bildirim yükü değil yalnızca veri içeriyorsa, uygulama her zaman ön plandaysa veya olmasa da ileti DAİMA onMessageReceive öğesine teslim edilir.
JacksOnF1re

125

notificationAlanı sunucu isteğinizden tamamen kaldırın . Yalnızcadata gönderin ve işleyin, onMessageReceived()aksi takdirde onMessageReceived()uygulama arka planda veya öldürüldüğünde tetiklenmez.

"priority": "high"Bildirim isteğinize alan eklemeyi unutmayın . Belgelere göre: veri mesajları normal bir öncelikle gönderilir, böylece anında ulaşmazlar; sorun da olabilir.

İşte sunucudan ne gönderiyorum

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......",
  "priority": "high"
}

Böylece verilerinizi onMessageReceived(RemoteMessage message)bu şekilde alabilirsiniz .... diyelim ki kimlik almak zorundayım

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

9
Ben sadece veri mesajı gönderirseniz, o zaman görev yöneticisinden temizlenir App bildirim almak mümkün olmayacaktır bulundu. Bu amaçlanan bir davranış mı?
Prabhjot Singh

2
Arka planda mesaj almamın çözümü buydu!
Ray Hulha

5
Uygulama öldürüldüğünde Oreo'da, onMessageReceived çağrılmaz. sadece veri ile yük var. herhangi bir güncellemen var mı?
Samir Mangroliya

2
Tıkır tıkır çalışıyor!
ssk

3
Bu cevap için seni çok seviyorum: p
Ahmad Arslan

63

bu yöntem handleIntent () amortismana tabi tutulmuştur, bu nedenle bir bildirim işleme aşağıdaki gibi yapılabilir:

  1. Ön Plan Durumu: Bildirim tıklaması, genellikle bildirimin veri yükü ile oluşturulduğu için programlı bir bildirim oluştururken sağladığınız Niyetin etkinliğine gider.

  2. Arka Plan / Öldürülen Durum - Burada, sistemin kendisi bildirim yüküne dayalı bir bildirim oluşturur ve bu bildirime tıklamak sizi yaşam döngüsü yöntemlerinizden herhangi birinde Niyet verilerini kolayca alabileceğiniz uygulamanın başlatıcı etkinliğine götürür.


Teşekkür ederim!!! Bu sorundan birkaç gün kaybettim ve bu da beni kurtardı.
Igor Janković

gerçekten mükemmel bir çözüm!
EduXavier

4
Bildirim görüntüleme mantığını handleIntent'te (Niyet amacı) kullanıyorum, ancak uygulama arka planda olduğunda, oluşturduğum biri ve varsayılan olarak bildirimden gelen tüm mesajı içeren 2 bildirim görüntülenir.
Joyson

5
Harika, ama OnMessageReceivedbu durumda herhangi bir fayda görmüyorum!?
Alaa AbuZarifa

8
Firebase-mesajlaşma: Ben com.google.firebase yaşıyorum 11.6.2 & handleIntent nihai now.Check olan stackoverflow.com/questions/47308155/...
Ronak Poriya

31

İşte firebase mesajı hakkında daha açık kavramlar. Destek ekibinden buldum.

Firebase'in üç mesaj türü vardır :

Bildirim mesajları : Bildirim mesajı arka planda veya ön planda çalışır. Uygulama arka planda olduğunda, bildirim mesajları sistem tepsisine gönderilir. Uygulama ön plandaysa, iletiler onMessageReceived()veya didReceiveRemoteNotificationgeri aramalar tarafından yönetilir . Bunlar aslında Ekran mesajları olarak adlandırılanlardır.

Veri mesajları : Android platformunda, veri mesajı arka planda ve ön planda çalışabilir. Veri mesajı onMessageReceived () tarafından işlenir. Platforma özel bir not şöyledir: Android'de veri yükü, etkinliğinizi başlatmak için kullanılan Niyet'ten alınabilir. Ayrıntılı olarak açıklamak gerekirse "click_action":"launch_Activity_1", bu amacı getIntent()yalnızca içinden alabilirsiniz Activity_1.

Hem bildirim hem de veri yükü olan iletiler : Arka planda olduğunda, uygulamalar bildirim tepsisindeki bildirim yükünü alır ve veri yükünü yalnızca kullanıcı bildirime dokunduğunda işler. Ön planda olduğunda, uygulamanız her iki yükü de içeren bir mesaj nesnesi alır. İkinci olarak, click_action parametresi genellikle veri yükünde değil bildirim yükünde kullanılır. Veri yükü içinde kullanılırsa, bu parametre özel anahtar / değer çifti olarak kabul edilir ve bu nedenle amaçlandığı şekilde çalışması için özel mantık uygulamanız gerekir.

Ayrıca, veri paketini ayıklamak için onMessageReceived yöntemini (bkz. Veri mesajı) kullanmanızı öneririm. Mantığınızdan, paket nesnesini kontrol ettim ve beklenen veri içeriğini bulamadım. İşte daha fazla netlik sağlayabilecek benzer bir duruma bir referans.

Sunucu tarafından, ateşbebeği bildirimi aşağıdaki formatta olmalıdır :

Sunucu tarafı "bildirim" nesnesi göndermelidir . TargetActivityKullanarak "bildirim" nesnesi eksikliği kullanarak mesaj alamadım getIntent().

Aşağıda doğru mesaj biçimi verilmiştir:

{
 "data": {
  "body": "here is body",
  "title": "Title"
 },
"notification": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

İşte firebase mesajı hakkında daha açık kavramlar. Destek ekibinden buldum.

Daha fazla bilgi için bu konuyu ve bu konuyu ziyaret edin


3
cihaz derin doz modundaysa (Android 7.0'da tanıtıldı) "veri mesajlarının" alınmayacağını belirtmek gerekir. bunlara dikkat et!
Sameer J

30

Ben de aynı problemi yaşadım. 'Bildirim' yerine 'veri mesajını' kullanmak daha kolaydır. Veri iletisi her zaman sınıfı onMessageReceived'e yükler.

Bu sınıfta bildirim oluşturucu ile kendi bildiriminizi yapabilirsiniz.

Misal:

 @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        sendNotification(remoteMessage.getData().get("title"),remoteMessage.getData().get("body"));
    }

    private void sendNotification(String messageTitle,String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        long[] pattern = {500,500,500,500,500};

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setVibrate(pattern)
                .setLights(Color.BLUE,1,1)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

7
Teşekkürler .. Sunucu kodumu değiştirdim ve "bildirim" yerine "veri" kullanıyorum ve şimdi mükemmel çalışıyor,
Mahesh Kavathiya

5
@ Sadece uygulama ön plandaysa, arka planda değilse çalışın. u her iki durumda da bu olayı tetiklemek için bana yardımcı olabilir ??
Anant Shah

@AnantShah Firebase sunucusuna POST nasıldır?
Koot

3
Aslında burada üç olası durum var. 1) Ön planda App. 2) Arka planda uygulama. 3) Uygulama çalışmıyor. Dediğiniz gibi, bir 'veri' mesajı ancak, ilk iki durumda alınacak değil uygulama çalışmadığı üçüncü durumda. Her üç vakayı da karşılamak için mesajdaki 'bildirim' alanını ayarlamanız gerekir. (Ayrıca iyi bir fikir iOS hem de Android istemcileri desteklemek istiyorsanız)
Steve Moseley

1
Uygulamada bile çalışmıyor, ben onmessagereceived işlevi sunucudan bir mesaj almak. İOS'u da desteklemek istiyorsanız 'bildirim'i kullanmanın daha iyi olduğunu kabul ediyorum.
Koot

21

Firebase Cloud Messaging belgelerine göre-Etkinlik ön planda ise onMessageReceived çağrılır. Etkinlik arka planda veya kapalıysa, uygulama başlatıcı etkinliği için bildirim merkezinde bildirim mesajı gösterilir. Firebase mesajlaşma için dinlenme servisi API'sini aşağıdaki gibi çağırarak uygulamanız arka plandaysa bildirim tıklamasıyla özelleştirilmiş etkinliğinizi arayabilirsiniz:

URL- https://fcm.googleapis.com/fcm/send

Yöntem Türü- POST

Header- Content-Type:application/json
Authorization:key=your api key

Gövde / Taşıma kapasitesi:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

Ve uygulamanızda bu ile çağrılacak etkinliğinize aşağıdaki kodu ekleyebilirsiniz:

<intent-filter>
                <action android:name="OPEN_ACTIVITY_1" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

Niyeti nerede yaratırım ve belirli bir etkinlik açmasını isterim? Bunun manifest'te OPEN_ACTIVITY_1 amacını kaydettiğini biliyorum, ama aslında nereden çağırıyorum?
Cyogenos


Amaç filtrelerinden bir etkinlik mi çağırmalıyız? Veya manuel olarak başlatılsın onMessageReceivedmı?
CoolMind

14

onMessageReceived (RemoteMessage remoteMessage) yöntemi aşağıdaki durumlara dayanarak çağrılır.

  • FCM Tepki ile bildirim ve veri bloğu:
{
  
"to": "device token list",
  "notification": {
    "body": "Body of Your Notification",
    "title": "Title of Your Notification"
  },
  "data": {
    "body": "Body of Your Notification in Data",
    "title": "Title of Your Notification in Title",
    "key_1": "Value for key_1",
    "image_url": "www.abc.com/xyz.jpeg",
    "key_2": "Value for key_2"
  }
}
  1. Ön Planda Uygulama:

onMessageReceived (RemoteMessage remoteMessage) adı verilen, bildirim çubuğunda LargeIcon ve BigPicture öğesini gösterir. Biz de içerik okuyabilir bildirimi ve veri bloğunun

  1. Arka Planda Uygulama:

onMessageReceived (RemoteMessage remoteMessage) çağrılmadıysa, sistem tepsisi mesajı alır ve bildirim bloğundan gövde ve başlığı okur ve bildirim çubuğunda varsayılan mesaj ve başlığı gösterir.

  • FCM Yanıtı Yalnızca veri bloğuyla:

Bu durumda, bildirim bloklarını json'dan kaldırma

{
  
"to": "device token list",
  "data": {
    "body": "Body of Your Notification in Data",
    "title": "Title of Your Notification in Title",
    "key_1": "Value for key_1",
    "image_url": "www.abc.com/xyz.jpeg",
    "key_2": "Value for key_2"
  }
}

OnMessageReceived () yöntemini çağırmak için çözüm

  1. Ön Planda Uygulama:

onMessageReceived (RemoteMessage remoteMessage) adı verilen, bildirim çubuğunda LargeIcon ve BigPicture öğesini gösterir. Biz de içerik okuyabilir bildirimi ve veri bloğunun

  1. Arka Planda Uygulama:

onMessageReceived (RemoteMessage remoteMessage) çağrıldığında, bildirim anahtarı yanıtta olmadığından sistem tepsisi iletiyi almaz. Bildirim çubuğunda LargeIcon ve BigPicture öğesini gösterir

kod

 private void sendNotification(Bitmap bitmap,  String title, String 
    message, PendingIntent resultPendingIntent) {

    NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
    style.bigPicture(bitmap);

    Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = mContext.getString(R.string.default_notification_channel_id);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);

        notificationManager.createNotificationChannel(notificationChannel);
    }
    Bitmap iconLarge = BitmapFactory.decodeResource(mContext.getResources(),
            R.drawable.mdmlogo);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.mdmlogo)
            .setContentTitle(title)
            .setAutoCancel(true)
            .setSound(defaultSound)
            .setContentText(message)
            .setContentIntent(resultPendingIntent)
            .setStyle(style)
            .setLargeIcon(iconLarge)
            .setWhen(System.currentTimeMillis())
            .setPriority(Notification.PRIORITY_MAX)
            .setChannelId(NOTIFICATION_CHANNEL_ID);


    notificationManager.notify(1, notificationBuilder.build());


}

Referans Bağlantısı:

https://firebase.google.com/docs/cloud-messaging/android/receive


Arka plan sorunundan muzdarip insanlar için en önemli kısım, sunucu tarafından gönderilen JSON'dan "bildirim" özelliğini kaldırmaktır. bu sorunu çözer. Çok teşekkürler.
Ramy M. Mousa

13

Ben de aynı sorunu yaşadım. Uygulama ön planda ise - bildirim türüne göre veritabanımı güncelleyebileceğim arka plan hizmetimi tetikler. Ancak, uygulama arka plana gider - varsayılan bildirim hizmeti kullanıcıya bildirimi göstermeye özen gösterilecektir.

Uygulamayı arka planda tanımlamak ve arka plan hizmetinizi tetiklemek için benim çözümüm,

public class FirebaseBackgroundService extends WakefulBroadcastReceiver {

  private static final String TAG = "FirebaseService";

  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "I'm in!!!");

    if (intent.getExtras() != null) {
      for (String key : intent.getExtras().keySet()) {
        Object value = intent.getExtras().get(key);
        Log.e("FirebaseDataReceiver", "Key: " + key + " Value: " + value);
        if(key.equalsIgnoreCase("gcm.notification.body") && value != null) {
          Bundle bundle = new Bundle();
          Intent backgroundIntent = new Intent(context, BackgroundSyncJobService.class);
          bundle.putString("push_message", value + "");
          backgroundIntent.putExtras(bundle);
          context.startService(backgroundIntent);
        }
      }
    }
  }
}

Manifest.xml dosyasında

<receiver android:exported="true" android:name=".FirebaseBackgroundService" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </receiver>

Bu çözümü en son android 8.0 sürümünde test etti. Teşekkürler


Bu FirebaseBackgroundService sınıfını kullanmak için whare ?? Nagendra Badiganti

bu kodu nerede kullanacağım ortak sınıf FirebaseBackgroundService, WakefulBroadcastReceiver @Nagendra Badiganti'yi genişletir

paketinizde bir hizmet sınıfı oluşturun ve manifest.xml dosyasına kaydolun. Bildirimleriniz için filtreye sahip olduğunuzdan emin olun. Hizmet her GCM bildirimi için tetiklendiğinden.
Nagendra Badiganti

firebase.google.com/docs/cloud-messaging/android/… Bu bağlantıyı takip ediyorum , bildirim almak için bu sınıfı eklemeliyim. Firebase ilk mesaj sadece mesaj gönderme .. tamamlandı ama bildirim almıyor diyor @Nagendra Badiganti

1
WakefulBroadcastReceiverAPI düzeyi 26.1.0'dan beri kullanımdan kaldırıldı.
Minoru

12

Uygulama arka plan modundaysa veya etkin değilken ( öldürüldüyse) ve Bildirim'i tıklarsanız , LaunchScreen'de yükü kontrol etmelisiniz (benim durumumda başlatma ekranı MainActivity.java).

Yani içinde MainActivity.java üzerinde onCreate için çek Ekstralar :

    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d("MainActivity: ", "Key: " + key + " Value: " + value);
        }
    }

Bildirim başlığını, gövdesini ve verilerini nasıl alabilirim?
Md.Tarikul İslam

1
Teşekkürler, cevap bu. @ Md.Tarikul Islam bu soruda belirtildiği gibi onMessageReceived () yöntemini kullanarak.
felixwcf

7

Benim handleIntentiçin FirebaseMessageServiceeserlerin yöntemini geçersiz kıl .

C # kodunda (Xamarin)

public override void HandleIntent(Intent intent)
{
    try
    {
        if (intent.Extras != null)
        {
            var builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            foreach (string key in intent.Extras.KeySet())
            {
                builder.AddData(key, intent.Extras.Get(key).ToString());
            }

            this.OnMessageReceived(builder.Build());
        }
        else
        {
            base.HandleIntent(intent);
        }
    }
    catch (Exception)
    {
        base.HandleIntent(intent);
    }
}

ve Java'daki Kod

public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }

            onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}

handleIntent () kesin
Ettore

@Ettore handleIntent işlevini nasıl çağırabilirim?
Hiroto

İleti Firebase'den aldığınızda yöntem çağrılır, ancak yöntem son olarak bildirildiği için geçersiz kılamazsınız. (Firebase 11.6.0)
Ettore

5

Varsayılan olarak, uygulamanız arka planda olduğunda uygulamanızdaki Başlatıcı Etkinliği başlatılır ve bildirimi tıklarsınız, bildiriminizle ilgili herhangi bir veri parçanız varsa, aşağıdaki gibi aynı etkinlikte işleyebilirsiniz,

if(getIntent().getExtras()! = null){
  //do your stuff
}else{
  //do that you normally do
}

MainActivity'den gidersem, belirli bir Etkinliğe nasıl geri dönülür?
Mac_Play

.? @Uzair getIntent () getExtras () her zaman null adlı alma, başka bir çözüm var uygulama yöntemini çağırmayın onMessageReceived bacground gidiyor musunuz
user2025187

3

Uygulama arka planda ise Varsayılan işlem bildirimi ile Yangın tabanı Ancak özel bildirimimizi almak istiyorsak, özel tarafımızı (veri yükü) göndermekten sorumlu olan sunucu tarafımızı değiştirmek zorundayız.

Bildirim yükünü sunucu isteğinizden tamamen kaldırın. Yalnızca Veri gönderin ve onMessageReceived () öğesinde işlem yapın, aksi takdirde uygulama arka planda veya öldürüldüğünde onMessageReceived öğeniz tetiklenmez.

şimdi, sunucu tarafı kod biçiminiz,

{
  "collapse_key": "CHAT_MESSAGE_CONTACT",
  "data": {
    "loc_key": "CHAT_MESSAGE_CONTACT",
    "loc_args": ["John Doe", "Contact Exchange"],
    "text": "John Doe shared a contact in the group Contact Exchange",
    "custom": {
      "chat_id": 241233,
      "msg_id": 123
    },
    "badge": 1,
    "sound": "sound1.mp3",
    "mute": true
  }
}

NOT : yukarıdaki
"text" kodundaki bu satıra bakın : "John Doe, Veri Değişimi grubundaki Contact Exchange" grubundaki bir kişiyi paylaştı İleti açıklaması veya ne olursa olsun, "gövde" veya "ileti" parametreleri yerine "metin" parametresini kullanmalısınız. metin kullanmak istiyorum.

onMessageReceived ()

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "From: " + remoteMessage.getData().toString());

        if (remoteMessage == null)
            return;

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
           /* Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());*/
            Log.e(TAG, "Data Payload: " + remoteMessage);

            try {

                Map<String, String> params = remoteMessage.getData();
                JSONObject json = new JSONObject(params);
                Log.e("JSON_OBJECT", json.toString());


                Log.e(TAG, "onMessageReceived: " + json.toString());

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

2

Bunu MainActivity'nin onCreate Metodunda çağırmanız yeterlidir:

if (getIntent().getExtras() != null) {
           // Call your NotificationActivity here..
            Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
            startActivity(intent);
        }

MainActivity'den gidersem, belirli bir Etkinliğe nasıl geri dönülür?
Mac_Play

2

t3h Exi'nin çözümüne göre burada temiz kodu göndermek istiyorum. Sadece MyFirebaseMessagingService içine koyun ve uygulama arka plan modundaysa her şey iyi çalışır. En azından com.google.firebase: firebase-messaging: 10.2.1 dosyasını derlemeniz gerekir

 @Override
public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }



           onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}

Çözümünüzü uygulamaya çalışıyorum, ancak handleIntent () yöntemi SDK sürümümde (SDK 27) son, bu yüzden hizmetimde geçersiz
kılamıyorum

Evet ama bu benim hatam ya da -1 vermek için herhangi bir sebep değil! Çok kibirli. Firebase 11.4.2'ye kadar çalışır, ardından google bunu değiştirdi (bu yöntemi kesinleştirdi). Şimdi kendi çözümünüzü bildirim ile programlamalısınız.
Frank

-1 değil, +1 verdim!
matdev

Sen işimi kurtarmak: P
amitabha2715

2

Bunu dene:

public void handleIntent(Intent intent) {
    try {
        if (intent.getExtras() != null) {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");
            for (String key : intent.getExtras().keySet()) {
            builder.addData(key, intent.getExtras().get(key).toString());
        }
            onMessageReceived(builder.build());
        } else {
            super.handleIntent(intent);
        }
    } catch (Exception e) {
        super.handleIntent(intent);
    }
}

handleIntent artık ateş tabanında kullanılmaz: 11.8.0 ve üstü.
Shihab Uddin

1

Bu sorunu yaşadım (uygulama arka planda veya kapalı ise bildirim tıklamasında açmak istemez) ve sorun click_actionbildirim gövdesinde geçersizdi , kaldırmayı veya geçerli bir şeye değiştirmeyi deneyin.


1

Vurgulamayı hak eden nokta , uygulama arka planda olsa bile onMessageReceived işleyicisini çağırmak için veri mesajını ( yalnızca veri anahtarı) kullanmanızdır . Yükünüzde başka bildirim mesajı anahtarı olmamalıdır, aksi takdirde uygulama arka plandaysa işleyici tetiklenmez.

Burada bahsedilmiştir (ancak FCM belgelerinde bu kadar vurgulanmamıştır):

https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

Uygulama sunucunuzu ve FCM sunucusu API'nızı kullanın: Yalnızca veri anahtarını ayarlayın . Katlanabilir veya katlanabilir olmayabilir.


1

Üzerinde çalıştığım arka uç Veri iletilerini değil Bildirim iletilerini kullanıyor . Bu yüzden tüm cevapları okuduktan sonra, başlatılan etkinliğe gelen niyetin demetinden ekstraları almaya çalıştım. Ama hangi anahtarları almaya çalıştığım önemli değil getIntent().getExtras();, değer her zaman boştu.

Ancak, sonunda Bildirim iletilerini kullanarak veri göndermenin ve bunu niyetten almanın bir yolunu buldum .

Buradaki anahtar, Veri yükünü Bildirim mesajına eklemektir .

Misal:

{
    "data": {
        "message": "message_body",
        "title": "message_title"
    },
    "notification": {
        "body": "test body",
        "title": "test title"
    },
    "to": "E4An.."
}

Bunu yaptıktan sonra, bilgilerinizi şu şekilde alabilirsiniz:

intent.getExtras().getString("title") olacak message_title

ve intent.getExtras().getString("message") olacakmessage_body

Referans


1

Sorununuz, Büyük Görüntü gösterme ile ilgili ise, yani, ateş temelli konsoldan bir görüntü ile push bildirimi gönderiyorsanız ve görüntüyü yalnızca uygulama ön plandaysa görüntüler. Bu sorunun çözümü, yalnızca veri alanına sahip bir push mesajı göndermektir. Bunun gibi bir şey:

{ "data": { "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg", "message": "Firebase Push Message Using API" "AnotherActivity": "True" }, "to" : "device id Or Device token" }

"AnotherActivity" den önce virgül kaybettiniz. Androidim titriyor ama gerçekten hiçbir şey gösterilmiyor (metin yok, görüntü yok, itme yok).
jekaby

1

Mesaj alındığında ve uygulamanız arka planda olduğunda bildirim ana etkinliğin ekstra amacına gönderilir.

Ekstra değeri, ana etkinliğin oncreate () veya onresume () işlevinde kontrol edebilirsiniz.

Veri, tablo vb. Gibi alanları (bildirimde belirtilen alanları) kontrol edebilirsiniz.

örneğin anahtar olarak veri kullanarak gönderdim

public void onResume(){
    super.onResume();
    if (getIntent().getStringExtra("data")!=null){
            fromnotification=true;
            Intent i = new Intent(MainActivity.this, Activity2.class);
            i.putExtra("notification","notification");
            startActivity(i);
        }

}

0

Aynı sorunu yaşıyordum ve bu konuda biraz daha kazıyordum. Uygulama arka planda olduğunda, bir bildirim iletisi sistem tepsisine gönderilir ANCAK bir veri mesajı gönderilir onMessageReceived()
Bkz https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
ve https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java

Gönderdiğiniz iletinin sağlanmasını sağlamak için dokümanlar, " Uygulama sunucunuzu ve FCM sunucusu API'sını kullanın: Yalnızca veri anahtarını ayarlayın. Katlanabilir veya daraltılamaz olabilir. " İfadesine
bakın . Bkz. Https://firebase.google.com/ docs / bulut mesajlaşma / kavram-seçenekleri # notifications_and_data_messages


0

İki tür mesaj vardır: bildirim mesajları ve veri mesajları. Yalnızca veri mesajı gönderirseniz, mesaj dizenizde bildirim nesnesi yoktur. Uygulamanız arka planda olduğunda çağrılır.


0

@Mahesh Kavathiya'nın cevabını kontrol edin. Benim durumumda, sunucu kodunda sadece böyle var:

{
"notification": {
  "body": "here is body",
  "title": "Title",
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

Aşağıdakileri değiştirmeniz gerekir:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
"notification": {
  "body": "here is body",
  "title": "Title"
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

Ardından, arka planda uygulama olması durumunda, fazladan varsayılan etkinlik amacı "veri" alır

İyi şanslar!


-1

Sadece FirebaseMessagingService'in OnCreate yöntemini geçersiz kılın. Uygulamanız arka planda olduğunda çağrılır:

public override void OnCreate()
{
    // your code
    base.OnCreate();
}

Bir açıklama ekleyebilir ve bazı belgelere bağlantı kurabiliyorsanız bu yanıt daha yararlı olabilir. Bunun nasıl yardımcı olması gerektiğini söyleyebilir misiniz?
kilokahn

@kilokahn Bana anlamadığın şeyi açıklayabilir misin? belirtilen yöntem sorunun bir parçası olan ve soruyu tam olarak cevaplayan koda eklenmelidir. Kod Xamarin içindir, ancak java'da dönüştürebilirsiniz.
Renzo Ciot

AFAIK Resmi belgeler ( firebase.google.com/docs/cloud-messaging/android/client ) FirebaseMessagingService'i genişleten bir hizmette OnCreate'i geçersiz kılmaktan bahsetmez. Ayrıca, cevabınızdan, onCreate'in geçersiz kılmasının, bildirim tıklandığında onMessageReceived'in çağrılmaması sorununu nasıl çözdüğü açık değildir - bu nedenle daha fazla bilgi talebi.
kilokahn

Belgeler, OnCreate yönteminin geçersiz kılmasından bahsetmiyor, ancak üretimde kullandığım için çalışıyor. OnMessageReceived yöntemine eklemek istediğiniz ve bazı arka plan işlemlerini gerçekleştirmeye yarayan kod OnCreate üzerinde gerçekleştirilebilir.
Renzo Ciot

Bu durumda, bir şekilde sizin için işe yaradığı gerçeğinin detaylandırılması, sadece çözümü listelemekten daha yararlı olabilir. Ayrıca, belgelenmemiş davranışların güncellemelerle çalışmayı keyfi olarak durdurması muhtemeldir ve bunları kullanan birisinin, kodunu yeniden çalıştığında yeniden hazırlamaya hazır olması gerekir. Bu feragatname konulmalıdır.
kilokahn

-1

Orada 2 tip ait Firebase itme bildirimleri:

1- Bildirim mesajı (Ekran mesajı) -> - 1.1 Bu varyantı seçerseniz, uygulama Arka Plandaysa işletim sistemi kendi kendine bir bildirim oluşturur ve içindeki verileri iletir intent. Sonra bu verileri işlemek istemciye kalmıştır.

- 1.2 Uygulamanın ise Önalan o zaman aracılığıyla alınacak bildirim callback-functioniçinde FirebaseMessagingServiceve bunu işlemek için müşteriye kalmış.

2- Veri mesajları (4k veriye kadar) -> Bu mesajlar yalnızca istemciye veri göndermek için kullanılır (sessizce) ve her iki durumda da geri arama fonksiyonu ile arka planda / ön planda işlem yapmak istemciye bağlıdır. FirebaseMessagingService

Bu resmi belgelere göre yapılır: https://firebase.google.com/docs/cloud-messaging/concept-options

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.