Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

İOS'ta birden fazla cihaza mesaj gönderin

Firebase Cloud Messaging, bir mesajı birden çok cihaza hedeflemek için iki yol sağlar:

  • Belirli bir konuyu seçen birden çok cihaza mesaj göndermenize olanak tanıyan konu mesajları .
  • Bir gruba ait cihazlarda çalışan bir uygulamanın birden çok örneğine tek bir mesaj göndermenize olanak tanıyan cihaz grubu mesajlaşması .

Bu eğitici, FCM için Admin SDK veya REST API kullanarak uygulama sunucunuzdan konu mesajları göndermeye ve bunları bir iOS uygulamasında alıp işlemeye odaklanır. Bu sayfada, kurulumdan doğrulamaya kadar bunu başarmak için gereken tüm adımlar listelenir - bu nedenle, FCM için bir iOS istemci uygulaması kurduysanız veya İlk Mesajınızı Gönderme adımlarını tamamladıysanız, zaten tamamladığınız adımları kapsayabilir.

Firebase'i iOS projenize ekleyin

Bu bölüm, uygulamanız için diğer Firebase özelliklerini zaten etkinleştirdiyseniz tamamlamış olabileceğiniz görevleri kapsar. Özellikle FCM için , APNs kimlik doğrulama anahtarınızı yüklemeniz ve uzaktan bildirimler için kaydolmanız gerekir .

Ön şartlar

  • Aşağıdakileri kurun:

    • Xcode 10.3 veya üstü
    • CocoaPods 1.4.0 veya üstü
  • Projenizin şu gereksinimleri karşıladığından emin olun:

    • Projeniz iOS 8 veya sonraki bir sürümünü hedeflemelidir.
  • Uygulamanızı çalıştırmak için fiziksel bir iOS cihazı kurun ve şu görevleri tamamlayın:

    • Apple Geliştirici hesabınız için bir Apple Push Bildirimi Kimlik Doğrulama Anahtarı edinin.
    • XCode'da Uygulama> Yetenekler altında Push Bildirimleri etkinleştirin.
  • Google hesabınızı kullanarak Firebase'de oturum açın.

Halihazırda bir Xcode projeniz yoksa ve sadece bir Firebase ürününü denemek istiyorsanız, hızlı başlangıç ​​örneklerimizden birini indirebilirsiniz.

Firebase projesi oluşturun

İOS uygulamanıza Firebase eklemeden önce, iOS uygulamanıza bağlanmak için bir Firebase projesi oluşturmanız gerekir. Firebase projeleri hakkında daha fazla bilgi edinmek için Firebase Projelerini Anlama sayfasını ziyaret edin.

Uygulamanızı Firebase'e kaydedin

Bir Firebase projeniz olduktan sonra, iOS uygulamanızı buna ekleyebilirsiniz.

Birden çok derleme varyantının nasıl işleneceği de dahil olmak üzere, bir Firebase projesine uygulama eklemeye yönelik en iyi uygulamalar ve dikkate alınması gereken noktalar hakkında daha fazla bilgi edinmek için Firebase Projelerini Anlama sayfasını ziyaret edin.

  1. Firebase konsoluna gidin .

  2. Projeye genel bakış sayfasının , kurulum iş akışını başlatmak için iOS simgesine ( ) tıklayın.

    Firebase projenize zaten bir uygulama eklediyseniz, platform seçeneklerini görüntülemek için Uygulama ekle'yi tıklayın.

  3. İOS paket kimliği alanına uygulamanızın paket kimliğini girin.

  4. (İsteğe bağlı) Diğer uygulama bilgilerini girin: Uygulama takma adı ve App Store Kimliği .

  5. Uygulamayı kaydet'i tıklayın.

Firebase yapılandırma dosyası ekleyin

  1. Firebase iOS yapılandırma dosyanızı ( GoogleService-Info.plist ) almak için GoogleService-Info.plist'i İndir'i tıklayın.

  2. Yapılandırma dosyanızı Xcode projenizin köküne taşıyın. İstenirse, yapılandırma dosyasını tüm hedeflere eklemeyi seçin.

Projenizde birden fazla paket kimliğiniz varsa, her uygulamanın kendi GoogleService-Info.plist dosyasına sahip olabilmesi için her paket kimliğini Firebase konsolundaki kayıtlı bir uygulamayla ilişkilendirmeniz gerekir.

Firebase SDK'larını uygulamanıza ekleyin

Firebase kitaplıklarını yüklemek için CocoaPods kullanmanızı öneririz . Ancak CocoaPod'ları kullanmak istemiyorsanız, SDK çerçevelerini doğrudan entegre edebilirsiniz.

Hızlı başlangıç ​​örneklerinden birini kullanıyor musunuz? Xcode projesi ve Podfile (kapsüller ile) zaten mevcut, ancak yine de Firebase yapılandırma dosyanızı eklemeniz ve bölmeleri yüklemeniz gerekir.

  1. Zaten sahip değilseniz bir Podfile oluşturun:

    cd your-project-directory
    pod init
  2. Pod Dosyanıza, uygulamanızda kullanmak istediğiniz Firebase bölmelerini ekleyin.

    Desteklenen Firebase ürünlerinden herhangi birini iOS uygulamanıza ekleyebilirsiniz.

    Firebase Bulut Mesajlaşma ile optimum deneyim için, projenizde Google Analytics'i etkinleştirmenizi öneririz. Ayrıca, Analytics kurulumunun bir parçası olarak, Analytics için Firebase SDK'sını uygulamanıza eklemeniz gerekir.

    Analytics etkinleştirildi

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'

    Analytics etkinleştirilmedi

    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'
  3. Bölmeleri yükleyin, ardından projeyi .xcworkspace görmek için .xcworkspace dosyanızı açın:

    pod install
    open your-project.xcworkspace

APNs kimlik doğrulama anahtarınızı yükleyin

APNs kimlik doğrulama anahtarınızı Firebase'e yükleyin. Zaten bir APNs kimlik doğrulama anahtarınız yoksa, bkz. APN'leri FCM ile Yapılandırma .

  1. Firebase konsolundaki projenizin içinde dişli simgesini seçin, Proje Ayarları'nı ve ardından Bulut Mesajlaşma sekmesini seçin.

  2. İOS uygulama yapılandırması altındaki APNs kimlik doğrulama anahtarında , Yükle düğmesini tıklayın.

  3. , Anahtarını kaydettiğiniz konuma gidin, dosyayı seçin ve Aç'ı tıklayın. (Sertifikalar, içinde identifikatörler & Profiles mevcut anahtar için anahtar kimliği ekle Elma Geliştirici Üye Merkezi ) ve Yükle'yi tıklayın.

Uygulamanızda Firebase'i başlatın

Uygulamanıza Firebase başlatma kodunu eklemeniz gerekecek. Firebase modülünü içe aktarın ve paylaşılan bir örneği gösterildiği gibi yapılandırın:

  1. Sizin de Firebase modülü içe UIApplicationDelegate :

    hızlı

    import Firebase

    Objective-C

    @import Firebase;
  2. Genellikle uygulamanızın uygulamasında bir FirebaseApp paylaşılan örneği yapılandırın application:didFinishLaunchingWithOptions: yöntem:

    hızlı

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];

Uzaktan bildirimler için kaydolun

Başlangıçta veya uygulama akışınızda istenen noktada, uygulamanızı uzaktan bildirimler için kaydedin. Call registerForRemoteNotifications gösterildiği gibi:

hızlı

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })
} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

İstemci uygulamasını bir konuya abone olun

İstemci uygulamaları mevcut herhangi bir konuya abone olabilir veya yeni bir konu oluşturabilir. Bir istemci uygulaması yeni bir konu adına (Firebase projeniz için halihazırda mevcut olmayan) abone olduğunda, FCM'de o adda yeni bir konu oluşturulur ve daha sonra herhangi bir müşteri buna abone olabilir.

Bir konuya abone olmak için, uygulamanızın ana iş parçacığından abonelik yöntemini çağırın (FCM iş parçacığı güvenli değildir). Abonelik talebi başlangıçta başarısız olursa, FCM otomatik olarak yeniden dener. Aboneliğin tamamlanamadığı durumlarda, abonelik, gösterildiği gibi bir tamamlama işleyicisinde yakalayabileceğiniz bir hata atar:

hızlı

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

Bu çağrı, FCM arka ucuna zaman uyumsuz bir istekte bulunur ve müşteriyi verilen konuya abone yapar. subscribeToTopic:topic çağırmadan önce, istemci uygulaması örneğinin didReceiveRegistrationToken geri çağırma aracılığıyla zaten bir kayıt belirteci aldığından emin olun.

Uygulama her başladığında, FCM istenen tüm konuların abone olduğundan emin olur. Aboneliği iptal etmek için unsubscribeFromTopic unsubscribeFromTopic:topic çağırın ve FCM arka planda konu aboneliğini iptal eder.

Konu mesajlarını alın ve yönetin

FCM, konu mesajlarını diğer aşağı akış mesajlarıyla aynı şekilde iletir.

AppDelegate application:didReceiveRemoteNotification: gösterildiği gibi:

hızlı

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Gönderme istekleri oluşturun

Bir konu oluşturduktan sonra, istemci tarafındaki konuya istemci uygulaması örneklerini abone olarak veya sunucu API'si aracılığıyla konuya mesaj gönderebilirsiniz. Bu, FCM için ilk kez gönderme istekleri oluşturuyorsanız, önemli arka plan ve kurulum bilgileri için sunucu ortamınız ve FCM kılavuzuna bakın.

Arka uçtaki gönderme mantığınızda, gösterilen şekilde istediğiniz konu adını belirtin:

node.js

// The topic name can be optionally prefixed with "/topics/".
var topic = 'highScores';

var message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
admin.messaging().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);

piton

# 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)

Git

// 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);

DİNLENME

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

Bir konu kombinasyonuna mesaj göndermek için, hedef konuları belirten bir mantıksal ifade olan bir koşul belirtin. Örneğin, aşağıdaki koşul, TopicA ve TopicB veya TopicC abone olan cihazlara mesajlar gönderecektir:

"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"

FCM önce parantez içindeki herhangi bir koşulu değerlendirir ve ardından ifadeyi soldan sağa doğru değerlendirir. Yukarıdaki ifadede, herhangi bir konuya abone olan bir kullanıcı mesajı almaz. Benzer şekilde, TopicA abone olmayan bir kullanıcı mesajı almaz. Bu kombinasyonlar onu alıyor:

  • TopicA ve TopicB
  • TopicA ve TopicC

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.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = {
  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.
admin.messaging().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(new Notification(
        "$GOOG up 1.43% on the day",
        "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day."))
    .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);

piton

# 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)

Git

// 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);

DİNLENME

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