Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Invia messaggi a più dispositivi su iOS

Firebase Cloud Messaging offre due modi per indirizzare un messaggio a più dispositivi:

  • Messaggistica argomento , che consente di inviare un messaggio a più dispositivi che hanno optato per un particolare argomento.
  • Messaggistica di gruppo dispositivo , che consente di inviare un singolo messaggio a più istanze di un'applicazione in esecuzione su dispositivi appartenenti ad un gruppo.

Questo tutorial si concentra su l'invio di messaggi argomento dalla vostra app server utilizzando l' SDK di amministrazione o REST API per FCM, e la ricezione e la manipolazione in un app iOS. Questa pagina elenca tutti i passi per raggiungere questo obiettivo, dal setup per la verifica - in modo che possa coprire passaggi che è già completato se è stato impostato un client iOS per FCM o lavorato attraverso la procedura per invia il primo messaggio .

Aggiungi Firebase al tuo progetto iOS

Questa sezione tratta le attività che potresti aver completato se hai già abilitato altre funzionalità di Firebase per la tua app. Per FCM nello specifico, è necessario caricare il tuo chiave di autenticazione APN e registrarsi per le notifiche a distanza .

Prerequisiti

  • Installa quanto segue:

    • Xcode 12.2 o successivo
    • CocoaPods 1.10.0 o successivo
  • Assicurati che il tuo progetto soddisfi questi requisiti:

    • Il tuo progetto deve avere come target iOS 10 o versioni successive.
  • Impostare un dispositivo iOS fisico per eseguire la vostra applicazione, e completare questi compiti:

    • Ottenere una spinta di notifica di Apple chiave di autenticazione per il vostro conto di Apple Developer .
    • Attiva notifiche push in XCode sotto App> Funzionalità.

Se non si dispone già di un progetto Xcode e vogliono solo provare un prodotto Firebase, è possibile scaricare uno dei nostri esempi rapidi .

Crea un progetto Firebase

Prima di poter aggiungere Firebase alla tua app iOS, devi creare un progetto Firebase per connetterti alla tua app iOS. Visita Capire Firebase progetti per saperne di più su progetti Firebase.

Registra la tua app con Firebase

Dopo aver creato un progetto Firebase, puoi aggiungere la tua app iOS.

Visita Capire Firebase Progetti per conoscere meglio le best practice e le considerazioni per l'aggiunta di applicazioni a un progetto Firebase, compreso il modo di gestire molteplici varianti di compilazione.

  1. Vai alla console Firebase .

  2. Al centro della pagina panoramica del progetto, fare clic sull'icona iOS ( ) per lanciare il flusso di lavoro di installazione.

    Se è già stato aggiunto un app per il vostro progetto Firebase, fare clic su Aggiungi app per visualizzare le opzioni di piattaforma.

  3. Inserire l'ID del fascio tua applicazione in iOS fascio campo ID.

  4. (Facoltativo) Immettere altre informazioni app: nick App e App Store ID.

  5. Fare clic su Registra app.

Aggiungi un file di configurazione Firebase

  1. Fare clic su Scarica GoogleService-Info.plist per ottenere il file di configurazione Firebase iOS ( GoogleService-Info.plist ).

  2. Sposta il tuo file di configurazione nella radice del tuo progetto Xcode. Se richiesto, selezionare per aggiungere il file di configurazione a tutte le destinazioni.

Se si dispone di più ID di bundle nel progetto, è necessario associare ogni ID fascio con un'applicazione registrato nella console Firebase in modo che ogni applicazione può avere il proprio GoogleService-Info.plist file.

Aggiungi gli SDK Firebase alla tua app

Si consiglia di utilizzare CocoaPods installare le librerie Firebase. Tuttavia, se si preferisce non utilizzare CocoaPods, è possibile integrare i quadri SDK direttamente o utilizzare Swift Package Manager , invece.

Si sta utilizzando uno dei esempi rapidi ? Il progetto Xcode e Podfile (con baccello) sono già presenti, ma avrete ancora bisogno di aggiungere il file di configurazione Firebase e installare i baccelli.

  1. Crea un Podfile se non ne hai già uno:

    cd your-project-directory
    pod init
  2. Al tuo Podfile, aggiungi i pod Firebase che desideri utilizzare nella tua app.

    È possibile aggiungere uno qualsiasi dei prodotti Firebase supportati al tuo iOS.

    Per un'esperienza ottimale con Firebase nube di messaggistica, si consiglia di consentire a Google Analytics nel progetto. Inoltre, come parte della configurazione di Analytics, devi aggiungere l'SDK Firebase per Analytics alla tua app.

    Analitica abilitata

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    
    # For Analytics without IDFA collection capability, use this pod instead
    # pod ‘Firebase/AnalyticsWithoutAdIdSupport’
    
    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'

    Scopri di più su IDFA, l'identificatore di pubblicità a livello di dispositivo, in Apple la privacy degli utenti e utilizzare i dati e App monitoraggio Trasparenza documentazione.

    Analitica non abilitata

    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'
  3. Installare i baccelli, quindi aprire il .xcworkspace file per vedere il progetto in Xcode:

    pod install
    open your-project.xcworkspace

Carica la tua chiave di autenticazione APNs

Carica la tua chiave di autenticazione APN su Firebase. Se non si dispone già di una chiave di autenticazione APNs, assicuratevi di crearne uno nel Centro membri di Apple Developer .

  1. Dentro il progetto nella console Firebase, selezionare l'icona dell'ingranaggio, selezionare Impostazioni di progetto e quindi selezionare la scheda di messaggistica cloud.

  2. In APN chiave di autenticazione in configurazione iOS, fare clic sul pulsante Carica.

  3. Individuare la posizione in cui è stata salvata la chiave, selezionarlo e fare clic su Apri. Aggiungere l'ID della chiave per la chiave (disponibile nel Stati Developer Center di Apple ) e fare clic su Carica.

Inizializza Firebase nella tua app

Dovrai aggiungere il codice di inizializzazione di Firebase alla tua applicazione. Importa il modulo Firebase e configura un'istanza condivisa come mostrato:

  1. Importare il modulo Firebase nella vostra UIApplicationDelegate :

    Swift

    import Firebase

    Obiettivo-C

    @import Firebase;
  2. Configurare un FirebaseApp istanza condivisa, di solito in della tua app application:didFinishLaunchingWithOptions: Metodo:

    Swift

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

    Obiettivo-C

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

Registrati per le notifiche remote

All'avvio o nel punto desiderato nel flusso dell'applicazione, registra la tua app per le notifiche remote. Chiama registerForRemoteNotifications come illustrato:

Swift

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

Obiettivo-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];

Sottoscrivere l'app client a un argomento

Le app client possono iscriversi a qualsiasi argomento esistente oppure possono creare un nuovo argomento. Quando un'app client si iscrive a un nuovo nome di argomento (uno che non esiste già per il tuo progetto Firebase), viene creato un nuovo argomento con quel nome in FCM e qualsiasi client può successivamente sottoscriverlo.

Per iscriverti a un argomento, chiama il metodo di sottoscrizione dal thread principale della tua applicazione (FCM non è thread-safe). Se la richiesta di sottoscrizione inizialmente fallisce, FCM riprova automaticamente. Per i casi in cui la sottoscrizione non può essere completata, la sottoscrizione genera un errore che è possibile rilevare in un gestore di completamento come mostrato:

Swift

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

Obiettivo-C

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

Questa chiamata effettua una richiesta asincrona al backend FCM e sottoscrive il client all'argomento specificato. Prima di chiamare subscribeToTopic:topic , assicurarsi che l'istanza del client app ha già ricevuto una registrazione di token tramite la richiamata didReceiveRegistrationToken .

Ad ogni avvio dell'app, FCM si assicura che tutti gli argomenti richiesti siano stati iscritti. Per annullare l'iscrizione, chiamare unsubscribeFromTopic:topic , e unsubscribes FCM dal tema in sottofondo.

Ricevi e gestisci messaggi di argomento

FCM consegna i messaggi topic allo stesso modo degli altri messaggi downstream.

Implementare application(_:didReceiveRemoteNotification:fetchCompletionHandler:) come indicato:

Swift

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

Obiettivo-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);
}

Crea richieste di invio

Dopo aver creato un argomento, sia sottoscrivendo istanze client App al tema sul lato client oppure tramite l' API del server , è possibile inviare messaggi al tema. Se questa è la prima volta che la costruzione di richieste di trasmissione per FCM, consultare la guida per l'ambiente server e FCM per importanti e le informazioni di configurazione.

Nella logica di invio sul backend, specifica il nome dell'argomento desiderato come mostrato:

Nodo.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);
  });

Giava

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

Pitone

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

andare

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

RIPOSO

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

comando URL:

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

Per inviare un messaggio a una combinazione di argomenti, specificare una condizione, che è un'espressione booleana che specifica gli argomenti di destinazione. Ad esempio, la seguente condizione inviare messaggi a dispositivi che sono iscritti a TopicA e sia TopicB o TopicC :

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

FCM valuta prima le condizioni tra parentesi, quindi valuta l'espressione da sinistra a destra. Nell'espressione sopra, un utente iscritto a un singolo argomento non riceve il messaggio. Allo stesso modo, un utente che non sottoscrivere TopicA non riceve il messaggio. Queste combinazioni lo ricevono:

  • TopicA e TopicB
  • TopicA e TopicC

Puoi includere fino a cinque argomenti nell'espressione condizionale.

Per inviare a una condizione:

Nodo.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);
  });

Giava

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

Pitone

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

andare

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

RIPOSO

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

comando URL:

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

Prossimi passi