Wysyłaj wiadomości na wiele urządzeń na platformach Apple

Aby kierować wiadomość na wiele urządzeń, użyj Wiadomości tematyczne. Ten umożliwia wysyłać wiadomość na wiele urządzeń, które wyraziły zgodę na dany temat.

Ten samouczek skupia się na wysyłaniu wiadomości tematycznych z serwera aplikacji za pomocą pakiet Admin SDK, Interfejs API typu REST dla FCM oraz ich otrzymywanie i obsługę. w aplikacji Apple. Na tej stronie znajdziesz listę wszystkich kroków niezbędnych do osiągnięcia tego celu, od konfiguracji po weryfikacji. Mogą one obejmować czynności, które zostały już wykonane, jeśli skonfigurować aplikację kliencką Apple na potrzeby FCM. lub postępuj zgodnie z instrukcjami wysyłania pierwszej wiadomości.

Dodaj Firebase do projektu Apple

Ta sekcja obejmuje zadania, które mogły zostać wykonane, jeśli zostały już włączone z innymi funkcjami Firebase w przypadku Twojej aplikacji. W przypadku FCM Trzeba prześlij klucz uwierzytelniania APNs i zarejestruj się do otrzymywania zdalnych powiadomień.

Wymagania wstępne

  • Zainstaluj następujące elementy:

    • Xcode 14.1 lub nowsza wersja
  • Sprawdź, czy Twój projekt spełnia te wymagania:

    • Twój projekt musi być kierowany na te wersje platformy lub nowsze:
      • iOS 11
      • macOS 10.13
      • tvOS 12
      • watchOS 6
  • skonfigurować fizyczne urządzenie Apple do uruchamiania aplikacji; i wykonaj te zadania:

    • Uzyskaj klucz uwierzytelniania Apple Push Notification do swojego Konto dewelopera Apple.
    • Włącz powiadomienia push w XCode w sekcji App > (Aplikacja >) Możliwości.

Jeśli nie masz jeszcze projektu Xcode i chcesz tylko wypróbować Firebase możesz pobrać nasze krótkie wprowadzenia.

Tworzenie projektu Firebase

Zanim dodasz Firebase do swojej aplikacji Apple, musisz utworzyć taką aplikację projekt, aby połączyć się z aplikacją. Odwiedź Więcej informacji o projektach Firebase Projekty Firebase.

Zarejestruj aplikację w Firebase

Aby używać Firebase w swojej aplikacji Apple, musisz ją zarejestrować w projekt Firebase. Rejestracja aplikacji często nazywa się „dodawaniem” aplikacji na w projektach AI.

  1. Otwórz konsolę Firebase.

  2. Na środku strony przeglądu projektu kliknij ikonę iOS+. aby rozpocząć proces konfiguracji.

    Jeśli masz już aplikację w projekcie Firebase, kliknij Dodaj aplikację. aby wyświetlić opcje platformy.

  3. W polu identyfikator pakietu wpisz identyfikator pakietu aplikacji.

    .
  4. (Opcjonalnie) Wpisz inne informacje o aplikacji: Nazwa aplikacji i identyfikator App Store.

  5. Kliknij Zarejestruj aplikację.

Dodaj plik konfiguracji Firebase

  1. Kliknij Download GoogleService-Info.plist, aby otrzymać Firebase Apple plik konfiguracji platform (GoogleService-Info.plist).

  2. Przenieś plik konfiguracji do katalogu głównego projektu Xcode. Jeśli pojawi się taka prośba, wybierz, aby dodać plik konfiguracyjny do wszystkich środowisk docelowych.

Jeśli masz w projekcie kilka identyfikatorów pakietów, musisz powiązać każdy z nich Identyfikator zarejestrowanej aplikacji w konsoli Firebase, aby każda aplikacja mogła mieć własny plik GoogleService-Info.plist.

Dodaj pakiety SDK Firebase do swojej aplikacji

Użyj menedżera pakietów Swift, aby zainstalować zależności Firebase i nimi zarządzać.

  1. W Xcode po otwarciu projektu aplikacji przejdź do File > Dodaj pakiety.
  2. Gdy pojawi się prośba, dodaj repozytorium SDK platform Apple Platform SDK Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Komunikacji w chmurze Firebase.
  5. Dodaj flagę -ObjC do sekcji Inne flagi łączące w ustawieniach kompilacji celu.
  6. Aby zapewnić optymalne działanie Komunikacji w chmurze Firebase (FCM), zalecamy włączenie Google Analytics, w projekcie Firebase i dodając do aplikacji pakiet SDK Firebase dla Google Analytics. Dostępne opcje wybrać bibliotekę bez zbierania danych IDFA lub z zbieraniem danych IDFA.
  7. Po zakończeniu Xcode automatycznie rozpocznie rozpoznawanie i pobieranie lub zależności w tle.

Prześlij klucz uwierzytelniania APNs

Prześlij klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APNs, utwórz go w Apple Developer Member Center

  1. W projekcie w konsoli Firebase wybierz ikona koła zębatego, wybierz Ustawienia projektu, a potem wybierz Karta Komunikacja w chmurze.

  2. W sekcji Klucz uwierzytelniania APN w sekcji Konfiguracja aplikacji na iOS kliknij przycisk Prześlij Przycisk

  3. Przejdź do miejsca, w którym masz zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w sekcji Apple Developer Member Center) i kliknij Prześlij.

Zainicjuj Firebase w swojej aplikacji

Musisz dodać do swojej aplikacji kod inicjowania Firebase. Importuj moduł Firebase i skonfiguruj współdzielone instancję, jak pokazano poniżej:

  1. Zaimportuj moduł FirebaseCore do UIApplicationDelegate, jak i wszelkie inne Moduły Firebase używane przez przedstawiciela aplikacji. Aby na przykład użyć Cloud Firestore i Uwierzytelniania:

    Certyfikat SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. Skonfiguruj FirebaseApp współdzielonej instancji w uprawnieniach przedstawiciela aplikacji Metoda application(_:didFinishLaunchingWithOptions:):

    Certyfikat SwiftUI

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Jeśli używasz SwiftUI, musisz utworzyć i dołączyć przedstawiciela aplikacji. do struktury App za pomocą UIApplicationDelegateAdaptor lub NSApplicationDelegateAdaptor Musisz też wyłączyć przełączanie przekazywania dostępu do aplikacji. Dla: więcej informacji znajdziesz w instrukcjach SwiftUI.

    Certyfikat SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

Zarejestruj się, aby otrzymywać powiadomienia zdalne

Podczas uruchamiania lub w oczekiwanym punkcie procesu aplikacji zarejestrować aplikację do otrzymywania zdalnych powiadomień. Zadzwoń do nas registerForRemoteNotifications jak pokazano:

Swift


UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Objective-C


[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

Subskrybowanie tematu w aplikacji klienckiej

Aplikacje klienckie mogą subskrybować dowolny istniejący temat lub utworzyć nowy temat. Gdy aplikacja kliencka subskrybuje nową nazwę tematu (taką, która nie jeszcze nie istnieje dla Twojego projektu Firebase), nowy temat o tej nazwie to utworzona w FCM i każdy klient może ją subskrybować.

Aby zasubskrybować temat, wywołaj metodę subskrypcji z głównego wątku aplikacji (FCM nie jest bezpieczne w wątku). Jeśli początkowo prośba o subskrypcję się nie powiedzie, FCM automatycznie spróbuje ponownie. Jeśli nie można zrealizować subskrypcji, subskrypcja zgłasza błąd, który można wykryć, w module obsługi uzupełniania, jak pokazano poniżej:

Swift

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");
}];

To połączenie powoduje do backendu FCM i subskrybuje klienta na dany temat. Zanim zadzwonisz pod numer subscribeToTopic:topic, sprawdź, czy instancja aplikacji klienckiej już otrzymała token rejestracji za pośrednictwem oddzwanianie: didReceiveRegistrationToken.

Przy każdym uruchomieniu aplikacji FCM sprawdza, czy wszystkie żądane tematy zostały zasubskrybowane. Do anuluj subskrypcję, zadzwoń do: unsubscribeFromTopic:topic, a FCM anuluje subskrypcję tematu w tle.

Odbieranie i obsługę wiadomości dotyczących tematów

FCM dostarcza wiadomości tematyczne w taki sam sposób, w jaki inne platformy otrzymują wiadomości wiadomości.

Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:) Jak widać:

Swift

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async
  -> UIBackgroundFetchResult {
  // 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)

  return UIBackgroundFetchResult.newData
}

Objective-C

- (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 full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Tworzenie żądań wysyłania

Po utworzeniu tematu przez zasubskrybowanie instancji aplikacji klienckiej po stronie klienta lub w interfejs API serwera, możesz wysyłać komunikaty do temat. Jeśli po raz pierwszy tworzysz prośby o wysłanie próśb do FCM, zobacz przewodnik środowiska serwera i FCM dla najważniejsze informacje i informacje o konfiguracji.

W logice wysyłania w backendzie określ odpowiednią nazwę tematu Jak widać:

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"
      }
   }
}

Polecenie cURL:

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

Aby wysłać wiadomość do kombinacji tematów: Określ warunek, czyli wyrażenie logiczne, które określa kierowania na tematy. Na przykład poniższy warunek spowoduje wysłanie wiadomości do urządzenia z subskrypcją TopicA oraz TopicB lub TopicC:

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

FCM najpierw ocenia warunki w nawiasach, a potem od lewej do prawej. W powyższym wyrażeniu użytkownik zasubskrybował każdy z tematów nie otrzyma wiadomości. Podobnie użytkownik, który nie subskrypcja użytkownika TopicA nie otrzymuje wiadomości. Takie kombinacje mają go otrzymać:

  • TopicA i TopicB
  • TopicA i TopicC

Wyrażenie warunkowe może zawierać maksymalnie 5 tematów.

Aby wysłać do warunku:

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",
    }
  }
}

Polecenie cURL:

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

Dalsze kroki