Recibe vínculos dinámicos de Firebase en una app de Flutter

Para recibir los vínculos dinámicos de Firebase que creaste, debes incluir el SDK de Dynamic Links en tu app y llamar al método FirebaseDynamicLinks.getDynamicLink() cuando la app se cargue a fin de obtener los datos que se pasaron en el vínculo dinámico.

  1. Instala e inicializa los SDK de Firebase para Flutter si aún no lo has hecho.

  2. Desde el directorio raíz de tu proyecto de Flutter, ejecuta el siguiente comando para instalar el complemento de Dynamic Links:

    flutter pub add firebase_dynamic_links
    
  3. Si estás creando una app para Android, abre la página Configuración del proyecto de Firebase console y asegúrate de haber especificado tu clave de firma SHA-1. Si usas vínculos de apps, también debes especificar la clave SHA-256.

Integración de plataformas

Completa los siguientes pasos de integración de las plataformas para las que creas tu app.

Android

En Android, debes agregar un nuevo filtro de intents para captar vínculos directos del dominio, ya que el vínculo dinámico redireccionará a tu dominio si la app está instalada. Esto es obligatorio para que tu app reciba los datos del vínculo dinámico después de instalarla o actualizarla desde Play Store y de presionar el botón Continuar. En AndroidManifest.xml:

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

Cuando los usuarios abren un vínculo dinámico con un vínculo directo al esquema y al host que especificaste, tu app inicia la actividad con este filtro de intents para administrar el vínculo.

El siguiente paso es asegurarte de que la huella digital SHA-256 del certificado de firma esté registrada en Firebase console para la app. Puedes encontrar más detalles sobre cómo recuperar tu huella digital SHA-256 en la página Authenticating Your Client.

Plataformas de Apple

  1. Crea una cuenta de desarrollador de Apple si aún no tienes una.

  2. En la página Configuración del proyecto de Firebase console, asegúrate de que la app para iOS esté configurada correctamente con el ID de App Store y el ID de equipo.

  3. En el sitio para desarrolladores de Apple, crea un perfil de aprovisionamiento para tu app con la función de dominio asociado habilitada.

  4. En Xcode, haz lo siguiente:

    1. Abre tu app debajo del encabezado TARGETS.

    2. En la página Signing & Capabilities, asegúrate de que tu equipo esté registrado y de que el perfil de aprovisionamiento esté configurado.

    3. En la página Signing & Capabilities, habilita Associated Domains y agrega lo siguiente a la lista de dominios asociados (reemplaza example por tu dominio):

      applinks:example.page.link
      
    4. En la página Info, agrega un tipo de URL a tu proyecto. En el campo URL Schemes, ingresa el ID del paquete de tu app. (El identificador puede ser Bundle ID o lo que desees).

    5. Si configuraste un dominio personalizado para tu proyecto de Firebase, agrega el prefijo de URL del vínculo dinámico al archivo Info.plist de tu proyecto de iOS con la clave FirebaseDynamicLinksCustomDomains.

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. 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 vínculo dinámico, 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 vínculo dinámico 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.

Para controlar un vínculo dinámico en tu aplicación, hay dos escenarios que requieren implementación.

Estado de cierre

Configura los siguientes métodos:

  1. FirebaseDynamicLinks.getInitialLink: Muestra un Future<PendingDynamicLinkData?>.
  2. FirebaseDynamicLinks.onLink: Controlador de eventos que muestra un Stream que contiene un PendingDynamicLinkData?.

Android siempre recibirá el vínculo a través de FirebaseDynamicLinks.getInitialLink desde un estado de cierre, pero no se garantiza que funcione en iOS. Por lo tanto, es conveniente configurarlas en el siguiente orden para asegurarte de que tu aplicación reciba el vínculo:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
    // Example of using the dynamic link to push the user to a different screen
    Navigator.pushNamed(context, deepLink.path);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  runApp(MyApp(initialLink));
}

Dentro de la lógica de la aplicación, puedes verificar si un vínculo se controló y realizar una acción, por ejemplo:

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

Estado de segundo plano/primer plano

Mientras la aplicación esté abierta o en segundo plano, usa el método get FirebaseDynamicLinks.onLink:

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});

Como alternativa, si deseas identificar si se usó un vínculo dinámico exacto para abrir la aplicación, pásalo al método getDynamicLink:

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

Para probar un vínculo dinámico en iOS, debes usar un dispositivo real. También deberás ejecutar la app en el modo de lanzamiento (es decir, flutter run --release) si vas a probar un vínculo dinámico desde un estado finalizado de la app (es decir, que la app está cerrada).