Recibe Dynamic Links en iOS

Para recibir los Firebase Dynamic Links que creaste, debes incluir el SDK de Dynamic Links en tu app y llamar a los métodos handleUniversalLink: y dynamicLinkFromCustomSchemeURL: cuando la app se cargue a fin de obtener los datos que se pasaron en el Dynamic Link.

Requisitos previos

Para usar Firebase Dynamic Links, debes tener iOS 8 o una versión más reciente. Puedes orientar la app a iOS 7, pero todas las llamadas del SDK de Firebase Dynamic Links no funcionarán si la app no se ejecuta en iOS 8 o una versión más reciente.

  1. Agrega Firebase al proyecto de iOS. Incluye el siguiente pod en tu Podfile:
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  2. Ejecuta pod install y abre el archivo .xcworkspace creado.
  3. En Firebase console, abre la sección Dynamic Links. Si se te solicita, acepta las Condiciones del Servicio.
  4. Asegúrate de que el ID de App Store y el prefijo de ID de tu app estén especificados en su configuración. Para ver y editar la configuración de tu app, ve a la página de configuración del proyecto de Firebase y selecciona tu app para iOS.

    A fin de confirmar que el proyecto de Firebase tenga la configuración correcta para usar Dynamic Links en la app para iOS, visita la siguiente URL:

    https://your_dynamic_links_domain/apple-app-site-association

    Si tu app está conectada, el archivo apple-app-site-association contiene una referencia al prefijo de ID de la app y del paquete. Por ejemplo:

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["/*"]}]}}

    Si el campo details está vacío, vuelve a verificar que hayas especificado el prefijo de ID de la app. Ten en cuenta que el prefijo de ID de la app podría no coincidir con el ID del equipo.

  5. Opcional: Impide que el SDK de Dynamic Links use el portapapeles de iOS.

    De forma predeterminada el SDK de Dynamic Links usa el portapapeles para mejorar la confiabilidad de los vínculos directos posteriores a la instalación. De esta manera Dynamic Links puede garantizar que, cuando un usuario abra un Dynamic Link, pero deba instalar tu app primero, pueda ir de inmediato al contenido vinculado original después de abrir la app por primera vez.

    La desventaja de esta opción es que el uso del portapapeles activa una notificación en iOS 14 y versiones posteriores. Por lo tanto, si el portapapeles contiene la URL de un Dynamic Link y los usuarios abren tu app por primera vez, verán una notificación de que la app accedió al portapapeles, lo que puede causar confusión.

    Para inhabilitar este comportamiento, edita el archivo Info.plist del proyecto de Xcode y configura la clave FirebaseDeepLinkPasteboardRetrievalEnabled como NO.

  1. En la pestaña Información del proyecto de Xcode de la app, crea un tipo de URL nuevo para usarlo con Dynamic Links. Asigna un valor único al Identificador y establece el campo Esquema de URL como el identificador de paquete, que es el esquema de URL predeterminado que usa Dynamic Links.
  2. En la pestaña Funciones del proyecto de Xcode de la app, habilita los dominios asociados y agrega lo siguiente a la lista de Dominios asociados:
    applinks:your_dynamic_links_domain
  3. Si deseas recibir Dynamic Links con un dominio completamente personalizado, crea una clave llamada FirebaseDynamicLinksCustomDomains en el archivo Info.plist de tu proyecto de Xcode y configúrala con los prefijos de URL de Dynamic Links de tu app. Por ejemplo:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Importa el módulo de Firebase en UIApplicationDelegate:

    Swift

    import Firebase

    Objective‑C

    @import Firebase;
  5. Configura una instancia compartida de FirebaseApp, generalmente en el método application:didFinishLaunchingWithOptions: de tu app:

    Swift

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

    Objective‑C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. A continuación, en el método application:continueUserActivity:restorationHandler: , controla los vínculos recibidos como vínculos universales cuando la app ya esté instalada (en iOS 9 y versiones posteriores):

    Swift

    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
        // ...
      }
    
      return handled
    }

    Objective‑C

    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  7. Por último, en los métodos application:openURL:sourceApplication:annotation: (iOS 8 y anteriores) y application:openURL:options: (iOS 9 y versiones posteriores), controla los vínculos recibidos a través del esquema de URL personalizada de tu app. Estos métodos se llaman cuando la app recibe un vínculo en iOS 8 y versiones anteriores, y cuando la app se abre por primera vez después de la instalación en cualquier versión de iOS.

    Si no se encuentra el Dynamic Link en el primer lanzamiento de tu app (en cualquier versión de iOS), este método se llamará con la url de FIRDynamicLink establecida en nil, lo que indica que el SDK no pudo encontrar un Dynamic Link pendiente que coincidiera.

    Swift

    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }

    Objective‑C

    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<NSString *, id> *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }