Usa la Verificación de aplicaciones para proteger el SDK de Navigation para iOS

La Verificación de aplicaciones de Firebase protege las llamadas que se realizan desde tu app a Google Maps Platform, ya que bloquea el tráfico que proviene de fuentes que no son tus apps legítimas. Para ello, solicita una evaluación de la autenticidad de la app o del dispositivo a un proveedor de certificación, como App Attest. Cuando integras tu app en la Verificación de aplicaciones, agregas protección contra solicitudes maliciosas y no autorizadas, lo que, a su vez, protege tu facturación de cargos no autorizados. La Verificación de aplicaciones también mejora significativamente los informes de interrupciones en tiempo real en el ecosistema de apps de tu flota, lo que beneficia a todos los conductores que usan tu app. Para obtener más información, consulta Informes de interrupciones.

¿Por qué usar la Verificación de aplicaciones?

La Verificación de aplicaciones protege dos áreas distintas del SDK de Navigation para iOS: la funcionalidad de navegación principal y los informes de interrupciones.

La Verificación de aplicaciones ayuda a bloquear las solicitudes principales del SDK de Navigation para iOS que provienen de fuentes maliciosas o no autorizadas. Esto te beneficia directamente, ya que protege tu proyecto contra el fraude de facturación y el agotamiento de la cuota.

Informes de interrupciones

Se recomienda usar la Verificación de aplicaciones si tu app admite funciones de votación y de informes de interrupciones en tiempo real. Habilitar la Verificación de aplicaciones garantiza que tus conductores reciban las rutas más precisas, teniendo en cuenta todos los comentarios en tiempo real.

Por qué la Verificación de aplicaciones es importante para los informes:

  • El alto nivel de confianza para los cierres: Los eventos que afectan las rutas, como las rutas cerradas, pueden alterar significativamente el comportamiento de la planificación de ruta para todos los conductores. Para proteger el mapa de posibles actos de vandalismo, spam o informes imprecisos, la infraestructura de moderación de Google para las interrupciones por rutas cerradas se basa en indicadores sólidos de integridad del dispositivo y de la app.
  • Cómo la Verificación de aplicaciones valida los informes: Los informes y votos de los usuarios que se envían desde el SDK de Navigation para iOS incluyen el token de la Verificación de aplicaciones, que el backend de Google usa para validar la legitimidad de los comentarios, lo que aumenta su nivel de confianza y permite que se evalúe su impacto en el mapa publicado.
  • El impacto de omitir la Verificación de aplicaciones: Los informes que se envían sin un token válido de la Verificación de aplicaciones se evalúan con un modelo de menor confianza y es posible que se procesen solo como indicadores silenciosos. Esto significa que, si bien tus usuarios aún pueden enviar avisos y votar, es menos probable que sus avisos aparezcan en el mapa o afecten las rutas de otros conductores, y requerirán una validación adicional.

¿La Verificación de aplicaciones es adecuada para mí?

Se recomienda la Verificación de aplicaciones en la mayoría de los casos. Sin embargo, no es necesaria ni compatible en las siguientes situaciones:

  • Apps privadas o experimentales: Si tu app no es de acceso público, no se necesita la Verificación de aplicaciones.
  • Dispositivos comprometidos: Los proveedores de certificación recomendados evitan que el SDK de Navigation para iOS se ejecute en dispositivos no confiables, como teléfonos con permisos de administrador o con jailbreak. Para admitir estos dispositivos, implementa un proveedor de certificación personalizado.

Descripción general de los pasos de implementación

En términos generales, seguirás estos pasos para integrar tu app en la Verificación de aplicaciones:

  1. Agrega Firebase a tu app.
  2. Agrega la biblioteca de la Verificación de aplicaciones y, luego, inicializa la Verificación de aplicaciones.
  3. Agrega un proveedor de tokens. En este paso, se invoca al proveedor de certificación que elijas para verificar la integridad del dispositivo o de la app.
  4. Inicializa las APIs de Navigation y Verificación de aplicaciones.
  5. Habilita la depuración. Esto es útil durante el desarrollo o en entornos de integración continua (CI).
  6. Supervisa las solicitudes de tu app antes de habilitar la aplicación de medidas por incumplimiento. De esta manera, aplicas la Verificación de aplicaciones sin problemas y sin interrumpir a los usuarios.

Consideraciones para planificar una integración de la Verificación de aplicaciones

  • Cuotas de los proveedores de certificación: Los proveedores de certificación que recomendamos, DeviceCheck o App Attest, están sujetos a las cuotas y limitaciones que establece Apple.
  • Latencia de inicio: En la mayoría de las situaciones, los usuarios no experimentarán latencia durante el uso habitual, ya que los tokens de la Verificación de aplicaciones se almacenan en caché en el dispositivo. El sistema actualiza automáticamente los tokens de Verificación de aplicaciones en segundo plano antes de que venzan para mantener un rendimiento sin interrupciones. Sin embargo, si no hay un token de Verificación de aplicaciones válido, los usuarios de tu app experimentarán cierta latencia durante el inicio. Por ejemplo, esta latencia se produce durante los inicios en frío cuando un token almacenado en caché venció o no está presente.
  • TTL del token: El tiempo de actividad (TTL) determina la cantidad de tiempo durante la cual el token de Verificación de aplicaciones es válido antes de que se deba actualizar. Puedes configurar esta duración de 30 minutos a 7 días en Firebase console. Se recomienda una duración de 1 hora como referencia segura, pero el SDK intenta automáticamente realizar actualizaciones en segundo plano aproximadamente a la mitad de la duración del TTL. Para obtener instrucciones paso a paso sobre la consola, consulta la documentación de la Verificación de aplicaciones de Firebase.

Integra tu app en la Verificación de aplicaciones

Requisitos previos y requisitos

  • Una app con el SDK de Navigation para iOS, versión 11.0 o posterior, instalado
  • El ID del paquete de la app.
  • El ID de tu equipo, que se encuentra en la pestaña Membership de tu consola de Apple Developer
  • Si planeas usar DeviceCheck, tu archivo de clave privada y el ID de clave.
  • Debes ser el propietario de la app en la consola de Google Cloud.
  • Es el ID del proyecto de tu app de la consola de Google Cloud.

Paso 1: Agrega Firebase a tu app

Sigue las instrucciones de la documentación para desarrolladores de Firebase para agregar Firebase a tu app. Agrega tu archivo GoogleService-Info.plist, sin modificar, al nivel raíz de tu proyecto.

En tu archivo AppDelegate, importa los siguientes módulos:

Swift

import FirebaseCore
import FirebaseAppCheck
import GoogleNavigation

Objective-C

@import FirebaseCore;
@import FirebaseAppCheck;
@import GoogleNavigation;

Paso 2: Agrega la biblioteca de Verificación de aplicaciones y, luego, inicializa la función

Firebase proporciona instrucciones para cada proveedor de certificación predeterminado. En estas instrucciones, se muestra cómo configurar un proyecto de Firebase y agregar la biblioteca de Verificación de aplicaciones a tu app. Sigue las muestras de código proporcionadas para inicializar la Verificación de aplicaciones.

  1. Sigue las instrucciones de Firebase para agregar la biblioteca de Verificación de aplicaciones:
  2. Inicializa la Verificación de aplicaciones en tu AppDelegate:
    • Si usas App Attest, crea una implementación de AppCheckProviderFactory y regístrala antes de llamar a FirebaseApp.configure():

      Swift

      class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
          func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
              return AppAttestProvider(app: app)
          }
      }
      // In application(_:didFinishLaunchingWithOptions:)
      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()

      Objective-C

      #import <FirebaseCore/FirebaseCore.h>
      #import <FirebaseAppCheck/FirebaseAppCheck.h>
      
      @interface YourAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
      @end
      
      @implementation YourAppCheckProviderFactory
      - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
          return [[FIRAppAttestProvider alloc] initWithApp:app];
      }
      @end
      
      // In application:didFinishLaunchingWithOptions:
      YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
      [FIRApp configure];
    • Si, en cambio, usas DeviceCheck, configura la fábrica con lo siguiente:

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      FIRDeviceCheckProviderFactory *providerFactory = [[FIRDeviceCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];

Paso 3: Agrega el proveedor de tokens

Crea un archivo llamado AppCheckTokenProvider (o, si usas Objective-C, dos archivos llamados AppCheckTokenProvider.h y AppCheckTokenProvider.m) en el nivel raíz de tu app.

Esta clase debe cumplir con el protocolo GMSAppCheckTokenProvider y, además, implementar el método fetchAppCheckTokenWithCompletion.

Swift

import Foundation
import FirebaseAppCheck
import GoogleNavigation

class AppCheckTokenProvider: NSObject, GMSAppCheckTokenProvider {
    func fetchAppCheckToken(completion: @escaping (String?, Error?) -> Void) {
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let error = error {
                print("App Check Error: \(error)")
                completion(nil, error)
                return
            }
            guard let token = token else {
                completion(nil, NSError(domain: "AppCheck", code: -1, userInfo: [NSLocalizedDescriptionKey: "Token is nil"]))
                return
            }
            print("App Check Token: \(token.token)")
            completion(token.token, nil)
        }
    }
}

Objective-C

// AppCheckTokenProvider.h
#import <Foundation/Foundation.h>
#import <GoogleNavigation/GoogleNavigation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppCheckTokenProvider : NSObject <GMSAppCheckTokenProvider>
@end

NS_ASSUME_NONNULL_END
// AppCheckTokenProvider.m
#import "AppCheckTokenProvider.h"
#import <FirebaseAppCheck/FirebaseAppCheck.h>

@implementation AppCheckTokenProvider
- (void)fetchAppCheckTokenWithCompletion:(void (^)(NSString * _Nullable token, NSError * _Nullable error))completion {
    [[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                     completion:^(FIRAppCheckToken * _Nullable token, NSError * _Nullable error) {
        if (token) {
            completion(token.token, nil);
        } else {
            completion(nil, error);
        }
    }];
}
@end

Paso 4: Inicializa las APIs de Navigation y Verificación de aplicaciones

Inicializa el SDK de Navigation para iOS y registra tu instancia de proveedor de tokens en GMSServices:

Swift

// In application(_:didFinishLaunchingWithOptions:)
GMSServices.provideAPIKey("YOUR_API_KEY")

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = AppCheckTokenProvider()

Objective-C

// In application:didFinishLaunchingWithOptions:
[GMSServices provideAPIKey:@"YOUR_API_KEY"];

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = [[AppCheckTokenProvider alloc] init];

Paso 5: Habilita la depuración (opcional)

Después de que se aplique la Verificación de aplicaciones para el SDK de Navigation para iOS, las funciones de tu app que dependen del SDK de Navigation para iOS no se ejecutarán en un simulador ni en un entorno de integración continua (CI), ya que estos entornos no califican como dispositivos válidos. Para ejecutar tu app en estos entornos durante el desarrollo y las pruebas, debes crear una compilación de depuración de la app que use el proveedor de depuración de la Verificación de aplicaciones en vez de un proveedor de certificación de producción.

  1. Configura la fábrica del proveedor de depuración en tu AppDelegate:

    Swift

    #if targetEnvironment(simulator)
    let providerFactory = AppCheckDebugProviderFactory()
    #else
    let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)

    Objective-C

    #if TARGET_OS_SIMULATOR
    id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init];
    #else
    id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init];
    #endif
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
  2. Habilita el registro en tu proyecto de Xcode, inicia la app y busca el token de depuración local en el registro de la consola.
  3. Copia y agrega este token de depuración a Firebase console. Para obtener más detalles, consulta la documentación del proveedor de depuración de la Verificación de aplicaciones de Firebase.

Paso 6: Supervisa las solicitudes de tu app y decide si aplicar medidas por incumplimiento

Antes de habilitar la aplicación de medidas por incumplimiento, supervisa las solicitudes de tu app para asegurarte de no interrumpir a los usuarios legítimos.

  1. Visita la pantalla de métricas de la Verificación de aplicaciones en Firebase console para ver el porcentaje de tráfico verificado en comparación con el no verificado.
  2. Una vez que te asegures de que la mayoría de tu tráfico está verificado y de que los usuarios legítimos actualizaron la app a una versión que contiene tu implementación de la Verificación de aplicaciones, habilita la aplicación de medidas por incumplimiento.
  3. Una vez que se active la aplicación de medidas por incumplimiento, la Verificación de aplicaciones rechazará todo el tráfico que no tenga un token válido de Verificación de aplicaciones.