Check out what’s new from Firebase at Google I/O 2022. Learn more

Configura una app cliente de Firebase Cloud Messaging en plataformas de Apple

En el caso de las apps cliente de Apple, puedes recibir cargas útiles de notificación y de datos de hasta 4,000 bytes en la interfaz de APNS de Firebase Cloud Messaging.

Para escribir tu código de cliente en Objective‑C o Swift, te recomendamos que uses la API de FIRMessaging. En el ejemplo de inicio rápido, se proporciona código de muestra para ambos lenguajes.

Referencias de método en Firebase Cloud Messaging

El SDK de FCM ejecuta el swizzling de métodos en dos áreas clave: la asignación de tu token de APNS al token de registro de FCM y la captura de los datos de estadísticas durante el manejo de devoluciones de llamadas de los mensajes descendentes. Los desarrolladores que prefieren no usar el swizzling pueden inhabilitar esta función. Para ello, se debe agregar la marca FirebaseAppDelegateProxyEnabled en el archivo Info.plist de la app y configurarla en NO (valor booleano). Las áreas relevantes de las guías proporcionan ejemplos de código con esta función inhabilitada y habilitada.

Agrega Firebase a tu proyecto de Apple

Si aún no lo has hecho, agrega Firebase a tu proyecto de Apple.

Sube tu clave de autenticación de APNS

Sube la clave de autenticación de APNs a Firebase. Si aún no tienes una, asegúrate de crearla en el Centro para miembros de Apple Developer.

  1. Dentro del proyecto en Firebase console, selecciona el ícono de ajustes, elige Configuración del proyecto y, luego, la pestaña Cloud Messaging.

  2. En Clave de autenticación de APNs, en Configuración de app para iOS, haz clic en el botón Subir.

  3. Busca la ubicación en la que guardaste la clave, selecciónala y haz clic en Abrir. Agrega el ID de clave correspondiente (disponible en el centro para miembros de Apple Developer) y haz clic en Subir.

Regístrate para habilitar las notificaciones remotas

Durante el inicio o en el punto que desees del flujo de tu aplicación, registra tu app para habilitar las notificaciones remotas. Llama a registerForRemoteNotifications como se muestra a continuación:

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

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

Accede al token de registro

De forma predeterminada, el SDK de FCM genera un token de registro para la instancia de app del cliente en el inicio de tu app. Al igual que el token de dispositivo de APNS, este token te permite enviar notificaciones segmentadas a cualquier instancia específica de tu app.

De la misma manera que las plataformas de Apple suelen enviar un token de dispositivo APNS al inicio de la app, FCM proporciona un token de registro a través del método messaging:didReceiveRegistrationToken: de FIRMessagingDelegate. El SDK de FCM recupera un token nuevo o uno existente durante el lanzamiento inicial de la app y cada vez que el token se actualiza o se invalida. En todos los casos, el SDK de FCM llama a messaging:didReceiveRegistrationToken: con un token válido.

El token de registro puede cambiar en las siguientes situaciones:

  • La app se restablece en un dispositivo nuevo.
  • El usuario desinstala y vuelve a instalar la app.
  • El usuario borra los datos de la app.

Configura el delegado de mensajería

Para recibir tokens de registro, implementa el protocolo de delegado de mensajería y configura la propiedad delegate de FIRMessaging después de llamar a [FIRApp configure]. Por ejemplo, si el delegado de tu aplicación sigue el protocolo de delegado de mensajería, puedes configurarlo en el mismo método application:didFinishLaunchingWithOptions:.

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

Recupera el token de registro actual

Los tokens de registro se envían a través del método messaging:didReceiveRegistrationToken:. Por lo general, se llama a este método una sola vez cuando se inicia la app con un token de registro. Cuando se lo llama, es el momento ideal para lo siguiente:

  • Enviarlo al servidor de tu aplicación (si el token de registro es nuevo)
  • Suscribir el token de registro a temas (esto solo es necesario para las suscripciones nuevas o para los casos en que el usuario volvió a instalar la app)

Para recuperar este token directamente, usa token(completion:). Si este proceso falla de cualquier manera, se genera un error que no es nulo.

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective‑C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

Puedes usar este método en cualquier momento para acceder al token en lugar de almacenarlo.

Supervisa la actualización de tokens

Para recibir notificaciones cada vez que el token se actualice, proporciona un delegado conforme al protocolo de delegado de mensajería. El siguiente ejemplo registra el delegado y agrega el método de delegado apropiado:

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("FCMToken"),
    object: nil,
    userInfo: dataDict
  )
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective‑C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

De manera alternativa, puedes escuchar para detectar una NSNotification llamada kFIRMessagingRegistrationTokenRefreshNotification en lugar de proporcionar un método de delegado. La propiedad del token siempre tiene el valor actual del token.

Swizzling inhabilitado: asignación de tu token de APNs y de registro

Si inhabilitaste el swizzling de métodos, deberás asignar explícitamente tu token de APNs al token de registro de FCM. Implementa el método application(_:didRegisterForRemoteNotificationsWithDeviceToken:) para recuperar el token de APNS y, luego, configura la propiedad apnsToken de Messaging:

Swift

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

Objective‑C

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

Después de que se genere el token de registro de FCM, puedes acceder al token y escuchar eventos actualizados usando los mismos métodos que con el swizzling habilitado.

Evita la inicialización automática

Cuando se genera un token de registro de FCM, la biblioteca sube el identificador y los datos de configuración a Firebase. Si deseas obtener primero una habilitación explícita de parte de los usuarios, puedes evitar la generación de tokens en el momento de la configuración si inhabilitas FCM. Para ello, agrega un valor de metadatos a Info.plist (no a GoogleService-Info.plist):

FirebaseMessagingAutoInitEnabled = NO

Para volver a habilitar FCM, realiza una llamada de tiempo de ejecución:

Swift

Messaging.messaging().autoInitEnabled = true

Objective‑C

[FIRMessaging messaging].autoInitEnabled = YES;

Este valor persiste en todos los reinicios de la aplicación una vez establecido.

Próximos pasos

Una vez que hayas configurado tu cliente Apple, puedes agregar el control de los mensajes y otro comportamiento más avanzado a tu app. Consulta estas guías para obtener más información: