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

Ricevi messaggi in un'app iOS

Una volta che l'app client è installata su un dispositivo, può ricevere messaggi tramite l'interfaccia APN di FCM. Si può iniziare immediatamente l'invio di notifiche ai segmenti di utenza con il compositore notifiche o messaggi costruiti sul server di applicazioni.

Gestire le notifiche di avviso

FCM consegna tutti i messaggi destinati a iOS tramite APN. Per ulteriori informazioni sulla ricezione di notifiche tramite APN UNUserNotificationCenter, consultare la documentazione di Apple sul Notifiche Manipolazione e azioni di notifica-correlati .

In iOS 10 e sopra, è necessario impostare il delegato UNUserNotificationCenter e implementare i metodi appropriati delegato per ricevere le notifiche di visualizzazione da FCM.

Swift

@available(iOS 10, *)
extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
                              withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions)
                                -> Void) {
    let userInfo = notification.request.content.userInfo

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

    // ...

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo

    // ...

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

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

Obiettivo-C

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

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

  // ...

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

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

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

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

  completionHandler();
}

Se si desidera aggiungere azioni personalizzate per le notifiche, impostare il click_action parametro nel payload di notifica . Utilizzare il valore che si usa per la category chiave nella APN payload. Le azioni personalizzate devono essere registrate prima di poter essere utilizzate. Per ulteriori informazioni, vedere di Apple notifica locale e remoto istruzioni di programmazione .

Per spaccato il recapito di messaggi per la vostra applicazione, vedere la dashboard di reporting FCM , che registra il numero di messaggi inviati e aperto su dispositivi iOS e Android, insieme ai dati di "impressioni" (notifiche visti dagli utenti) per Android apps.

Gestire le notifiche push silenziose

Quando si inviano messaggi con il content_available chiave (equivalenti a delle APN content-available , i messaggi saranno consegnati come notifiche silenziose, veglia la vostra applicazione in background per compiti come l'aggiornamento dei dati in background. Notifiche in primo piano differenza, queste notifiche devono essere gestite tramite appDelegate(_:didReceiveRemoteNotification:fetchCompletionHandler:) metodo.

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

iOS non garantisce la consegna delle notifiche in background. Per conoscere le condizioni che possono causare le notifiche in background per fallire, vedi Documentazione di Apple su Pushing aggiornamenti in background alla tua app .

Interpretazione del payload del messaggio di notifica

Il payload dei messaggi di notifica è un dizionario di chiavi e valori. I messaggi di notifica inviati tramite APN seguono il formato del payload APN come di seguito:

  {
    "aps" : {
      "alert" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
      },
      "badge" : 1,
    },
    "customKey" : "customValue"
  }

Gestire i messaggi con il metodo swizzing disabilitato

Per impostazione predefinita, se si imposta la classe di applicazione delegato della tua applicazione per le UNUserNotificationCenter e Messaging proprietà delegato, FCM sarà swizzle la classe delegato app per automaticamente associare i FCM token con APN del dispositivo token e superare eventi di notifica accolta ad Analytics. Se disabiliti esplicitamente il metodo swizzling o usi una classe separata per entrambi i delegati, dovrai eseguire entrambe queste attività manualmente.

Per associare il FCM token con l'APN dispositivo Token, passare i APN token al Messaging classe nella vostra applicazione del delegato del gestore token di aggiornamento tramite apnsToken di proprietà .

Swift

func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken;
}
 

Obiettivo-C

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [FIRMessaging messaging].APNSToken = deviceToken;
}

Per passare la notifica informazioni ricevuta ad Analytics, utilizzare appDidReceiveMessage(_:) metodo .

Swift

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
  withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  let userInfo = notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  // Change this to your preferred presentation option
  completionHandler([[.alert, .sound]])
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  completionHandler()
}

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  Messaging.messaging().appDidReceiveMessage(userInfo)
  completionHandler(.noData)
}

Obiettivo-C

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  completionHandler();
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
  completionHandler(UIBackgroundFetchResultNoData);
}