Bir mesajı birden çok cihaza hedeflemek için şunu kullanın: Konu mesajları. Bu özelliği kullanarak Belirli bir konuda kaydolan birden çok cihaza mesaj gönderebilirsiniz.
Bu eğitim, Admin SDK veya FCM için REST API, ve ele alma sürecini Android uygulamasında kullanabilirsiniz. Hem arka plandaki hem de e-postalara yönelik ön plandaki uygulamalar. Kurulumdan bu amaca yönelik tüm adımlar ele alınmıştır. doğrulama.
SDK'yı ayarlama
Bu bölümde, Android istemci uygulaması yüklemiş olmanız gerekir FCM için kullanabilir veya İlk Mesajınızı Gönderin.
Başlamadan önce
Android Studio'yu yükleme veya güncelleme sürümüne geri yükleyebilirsiniz.
Projenizin bu gereksinimleri karşıladığından emin olun (bazı ürünlerin daha katı şartlara sahip olabilir):
- API düzeyi 19'u hedefler (KitKat) veya üzeri
- Android 4.4 veya sonraki bir sürümü kullanmalıdır
- Kullanım
Jetpack (AndroidX),
Aşağıdaki sürümle ilgili koşullar karşılanmalıdır:
com.android.tools.build:gradle
7.3.0 veya sonraki sürümlercompileSdkVersion
28 yaş veya üzeri
Fiziksel bir cihaz ayarlayın veya emülatörü kullanarak uygulamanızı çalıştırın.
Google Play'e bağımlılığı olan Firebase SDK'larının hizmetleri için cihaz veya emülatöründe Google Play Hizmetleri yüklü olmalıdır.Google Hesabınızla Firebase'de oturum açın hesap.
Henüz bir Android projeniz yoksa ve bir Firebase'i denemek istiyorsanız hızlı başlangıç örneklerimizden birini indirebilirsiniz.
Firebase projesi oluşturma
Firebase'i Android uygulamanıza eklemeden önce Firebase oluşturmanız gerekir projesini anlatacağım. Ziyaret edin: Şu konular hakkında daha fazla bilgi edinmek için Firebase Projelerini Anlama: Firebase projeleri.
Uygulamanızı Firebase'e kaydedin
Firebase'i Android uygulamanızda kullanmak için, uygulamanızı Firebase projesi. Uygulamanızı kaydetme işlemi genellikle "ekleme" olarak adlandırılır uygulamanızı belirler.
Firebase konsoluna gidin.
Projeye genel bakış sayfasının ortasındaki Android simgesini tıklayın (
) veya kurulum iş akışını başlatmak için Uygulama ekle'yi tıklayın.Uygulamanızın paket adını Android paket adı alanına girin.
ziyaret edin.(İsteğe bağlı) Diğer uygulama bilgilerini girin: Uygulama takma adı ve SHA-1 imza sertifikası hatalarını ayıkla.
Uygulamayı kaydet'i tıklayın.
Firebase yapılandırma dosyası ekleme
Firebase Android yapılandırma dosyasını indirip ekleyin. (
) uygulamanıza:google-services.json Firebase Android sürümünüzü edinmek için google-services.json'u indir'i tıklayın. yapılandırma dosyası.
Yapılandırma dosyanızı şu uygulamanın modül (uygulama düzeyi) kök dizinine taşıyın: en iyi şekilde yararlanabilirsiniz.
yapılandırma dosyanızdaki değerleri erişilebilir hale getirmek için Firebase SDK'larını kullanıyorsanız Google hizmetleri Gradle eklentisi (google-services.json google-services
).Kök düzeyindeki (proje düzeyinde) Gradle dosyanızda (
<project>/build.gradle.kts
veya<project>/build.gradle
), Bağımlılık olarak Google hizmetleri eklentisi:Kotlin
plugins { id("com.android.application") version "7.3.0" apply false // ... // Add the dependency for the Google services Gradle plugin id("com.google.gms.google-services") version "4.4.2" apply false }
Groovy
plugins { id 'com.android.application' version '7.3.0' apply false // ... // Add the dependency for the Google services Gradle plugin id 'com.google.gms.google-services' version '4.4.2' apply false }
Modülünüz (uygulama düzeyinde) Gradle dosyanızda (genellikle
<project>/<app-module>/build.gradle.kts
veya<project>/<app-module>/build.gradle
), Google hizmetleri eklentisini ekleyin:Kotlin
plugins { id("com.android.application") // Add the Google services Gradle plugin id("com.google.gms.google-services") // ... }
Groovy
plugins { id 'com.android.application' // Add the Google services Gradle plugin id 'com.google.gms.google-services' // ... }
Firebase SDK'larını uygulamanıza ekleyin
Modül (uygulama düzeyinde) Gradle dosyanızda (genellikle
<project>/<app-module>/build.gradle.kts
veya<project>/<app-module>/build.gradle
), Android için Firebase Cloud Messaging kitaplığına bağımlılığı ekleyin. Şunu kullanmanızı öneririz: Firebase Android BoM Kitaplık'ta sürüm oluşturmayı kontrol etmek içinEn iyi Firebase Cloud Messaging deneyimi için şunları öneririz: Google Analytics özelliğini etkinleştirme Firebase projenize ekleyin ve uygulamanıza Google Analytics için Firebase SDK'sını ekleyin.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.1.2")) // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-messaging") implementation("com.google.firebase:firebase-analytics") }
Firebase Android BoM kullanıldığında, Uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanacaktır.
(Alternatif) Firebase kitaplığı bağımlılıklarını kullanmadan BoM
Firebase BoM kullanmamayı seçerseniz her Firebase kitaplığı sürümünü belirtmeniz gerekir değerini alır.
Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız, kitaplık sürümlerini yönetmek için BoM kullanmanızı öneririz. Bu, tüm sürümlerin uyumlu olduğundan emin olun.
dependencies { // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-messaging:24.0.0") implementation("com.google.firebase:firebase-analytics:22.0.2") }
.Android projenizi Gradle dosyalarıyla senkronize edin.
İstemci uygulamasının bir konuya abone olmasını sağlama
İstemci uygulamaları mevcut herhangi bir konuya abone olabilir veya yeni bir konu oluşturabilir konu. Bir istemci uygulaması yeni bir konu adına abone olduğunda ( Firebase projeniz için zaten mevcut değilse) bu ada sahip yeni bir konu FCM ürününde oluşturulur ve tüm müşteriler daha sonra bu hizmete abone olabilir.
İstemci uygulaması bir konuya abone olmak için Firebase Cloud Messaging numarasını arar
FCM konu adına sahip subscribeToTopic()
. Bu yöntem
bir tamamlama dinleyicisi tarafından kullanılabilir;Task
abonelik başarılı oldu:
Kotlin+KTX
Firebase.messaging.subscribeToTopic("weather") .addOnCompleteListener { task -> var msg = "Subscribed" if (!task.isSuccessful) { msg = "Subscribe failed" } Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() }
Java
FirebaseMessaging.getInstance().subscribeToTopic("weather") .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { String msg = "Subscribed"; if (!task.isSuccessful()) { msg = "Subscribe failed"; } Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
İstemci uygulaması, abonelikten çıkmak için Firebase Cloud Messaging unsubscribeFromTopic()
numaralı telefonu arar.
konu adını yazın.
Konu mesajlarını alma ve işleme
FCM, konu mesajlarını diğer aşağı akışla aynı şekilde sunar mesaj.
Mesajları almak için
FirebaseMessagingService
değerleridir.
Hizmetiniz onMessageReceived
ve onDeletedMessages
koşullarını geçersiz kılmalıdır
daha fazla bilgi edindiniz.
Bir iletinin işlenmesi için gereken süre, gecikmelere bağlı olarak 20 saniyeden kısa olabilir.
onMessageReceived
çağrılmadan önce ücretlendirme (OS gecikmeleri, uygulama başlatma süresi,
diğer işlemler tarafından engellenen ana iş parçacığı veya önceki onMessageReceived
çok uzun sürüyor. Sonrasında, Android'in
işlem
öldürme veya Android O'nun
arka planda yürütme sınırları işlerinizi tamamlamanızı engelleyebilir.
onMessageReceived
, aşağıdakiler dahil çoğu mesaj türü için sağlanır:
istisnalar:
-
Uygulamanız arka plandayken teslim edilecek bildirim mesajları Burada durumda, bildirim cihazın sistem tepsisine iletilir. Kullanıcı bir bildirime dokunduğunda varsayılan olarak uygulama başlatıcıyı açar.
-
Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar. Bu durumda, bildirim cihazın sistem tepsisine iletilir. ve veri yükü ekstra başlatıcı Etkinliğinizin amacı.
Özet olarak:
Uygulama durumu | Bildirim | Veriler | İkisi de |
---|---|---|---|
Ön plan | onMessageReceived |
onMessageReceived |
onMessageReceived |
Arka plan | Sistem tepsisi | onMessageReceived |
Bildirim: sistem tepsisi Veri: Amacın ekstralarında. |
Uygulama manifestini düzenleyin
FirebaseMessagingService
uygulamasını kullanmak için aşağıdakileri sayfanıza eklemeniz gerekir:
uygulama manifesti:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Ayrıca, bildirimlerin görünümünü özelleştirmek için varsayılan değerler ayarlamanız önerilir. Siz özel bir varsayılan simge ve her cihazda uygulanan özel bir varsayılan renk eşdeğer değerler bildirim yükünde ayarlanmaz.
Bu satırları,
application
etiketini kullanarak özel varsayılan simgeyi ve özel rengi ayarlayın:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
Android, şunun için özel varsayılan simgeyi görüntüler:
- Bildirim oluşturucu.
- Bildirim yükünde simgeyi açıkça belirtmeyen tüm bildirim mesajları.
Android,
- Bildirim oluşturucu.
- Bildirimdeki rengi açık bir şekilde ayarlamayan tüm bildirim iletileri yük.
Özel bir varsayılan simge ayarlanmazsa ve bildirim yükünde herhangi bir simge ayarlanmamışsa Android'de uygulama simgesi beyaz renkte görüntülenir.
onMessageReceived
ayarını geçersiz kıl
FirebaseMessagingService.onMessageReceived
yöntemini geçersiz kılarak
alınan iletişim bilgilerine göre
RemoteMessage
nesnesini ifade edin ve ileti verilerini alın:
Kotlin+KTX
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
onDeletedMessages
ayarını geçersiz kıl
Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, aynı anda çok fazla
mesaj (>100) için beklemede
sırasında veya bağlı değilken belirli bir cihazda uygulamanızı
Bir aydan uzun bir süre içinde FCM. Böyle durumlarda
FirebaseMessagingService.onDeletedMessages()
numaralı telefonu arayabilirsiniz
Uygulama örneği bu geri çağırmayı aldığında
uygulama sunucunuzla tam senkronizasyon gerçekleştirmesi gerekir. Uygulamaya bu konuda mesaj göndermediyseniz
cihazı son 4 hafta içinde ararsa FCM, onDeletedMessages()
adlı cihazı aramaz.
Bildirim mesajlarını arka plandaki bir uygulamada işleme
Android, uygulamanız arka planda çalışırken bildirim mesajlarını şuraya yönlendirir: sistem tepsisini açın. Kullanıcı bildirime dokunduğunda uygulama başlatıcıyı açan kişi: varsayılandır.
Buna, hem bildirim hem de veriler içeren mesajlar dahildir yük (ve Notifications konsolundan gönderilen tüm mesajlar). Bu durumlarda, bildirim cihazın veri yükü amaçlanan ekstra şeklinde teslim edilir başlatıcı Etkinliğiniz.
Uygulamanıza mesaj teslimiyle ilgili analizler için bkz. FCM raporlama kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısı "gösterimler" için veriler (kullanıcılar tarafından görülen bildirimler).
Gönderme istekleri oluşturma
Bir konu oluşturduktan sonra, istemci uygulaması örneklerini müşteri tarafında veya müşteri tarafında sunucu API'sine sahipseniz, konu. FCM için ilk kez gönderme istekleri oluşturuyorsanız kılavuzu inceleyin sunucu ortamınız ve FCM önemli arka plan ve kurulum bilgilerini sağlar.
Arka uçtaki gönderme mantığınızda istediğiniz konu adını belirtin. gösterildiği gibi:
Node.js
// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';
const message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};
// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Java
// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setTopic(topic)
.build();
// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Python
# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'
# See documentation on defining a message payload.
message = messaging.Message(
data={
'score': '850',
'time': '2:45',
},
topic=topic,
)
# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Go
// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Topic: topic,
}
// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
C#
// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";
// See documentation on defining a message payload.
var message = new Message()
{
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
Topic = topic,
};
// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic" : "foo-bar",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message"
}
}
}
cURL komutu:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message": {
"topic" : "foo-bar",
"notification": {
"body": "This is a Firebase Cloud Messaging Topic Message!",
"title": "FCM Message"
}
}
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Konulardan oluşan bir kombinasyona ileti göndermek için:
bir koşul belirtin. Bu,
konuları ele alalım. Örneğin, aşağıdaki koşul iletileri
TopicA
ve TopicB
ya da TopicC
aboneliklerine abone olan cihazlar:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM, önce parantez içindeki koşulları değerlendirir, ardından
tıklayın. Yukarıdaki ifadede, bir kullanıcı
mesajı almamasını sağlayabilirsiniz. Benzer şekilde,
TopicA
için abone ol düğmesi, mesajı almıyor. Bu kombinasyonlar
alın:
TopicA
veTopicB
TopicA
veTopicC
Koşullu ifadenize en fazla beş konu ekleyebilirsiniz.
Bir koşula göndermek için:
Node.js
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';
// See documentation on defining a message payload.
const message = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
condition: condition
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Java
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle("$GOOG up 1.43% on the day")
.setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
.build())
.setCondition(condition)
.build();
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Python
# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"
# See documentation on defining a message payload.
message = messaging.Message(
notification=messaging.Notification(
title='$GOOG up 1.43% on the day',
body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
),
condition=condition,
)
# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Go
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Condition: condition,
}
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
C#
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
var message = new Message()
{
Notification = new Notification()
{
Title = "$GOOG up 1.43% on the day",
Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Condition = condition,
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"condition": "'dogs' in topics || 'cats' in topics",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message",
}
}
}
cURL komutu:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"notification": {
"title": "FCM Message",
"body": "This is a Firebase Cloud Messaging Topic Message!",
},
"condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Sonraki adımlar
- Sunucunuzu kullanarak istemci uygulaması örneklerini konulara abone olabilir ve diğer yönetim görevlerini tamamlamanıza yardımcı olur. Görüntüleyin Sunucudaki konu aboneliklerini yönetin.