Receba links dinâmicos do Firebase em um aplicativo Flutter

Para receber os links dinâmicos do Firebase que você criou , você deve incluir o SDK do Dynamic Links em seu aplicativo e chamar o método FirebaseDynamicLinks.getDynamicLink() quando o aplicativo for carregado para receber os dados transmitidos no link dinâmico.

  1. Instale e inicialize os SDKs do Firebase para Flutter , caso ainda não tenha feito isso.

  2. No diretório raiz do seu projeto Flutter, execute o seguinte comando para instalar o plug-in Dynamic Links:

    flutter pub add firebase_dynamic_links
    
  3. Se você estiver criando um aplicativo para Android, abra a página de configurações do projeto do console do Firebase e verifique se especificou sua chave de assinatura SHA-1. Se você usa links de aplicativos, especifique também sua chave SHA-256.

Integração da plataforma

Conclua as etapas de integração de plataforma a seguir para as plataformas para as quais você está criando seu aplicativo.

Android

No Android, você deve adicionar um novo filtro de intent para capturar links diretos de seu domínio, pois o link dinâmico redirecionará para seu domínio se seu aplicativo estiver instalado. Isso é necessário para que seu aplicativo receba os dados do Dynamic Link após a instalação/atualização da Play Store e um toque no botão Continuar. Em 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>

Quando os usuários abrem um link dinâmico com um link direto para o esquema e o host que você especificar, seu aplicativo iniciará a atividade com esse filtro de intent para lidar com o link.

Plataformas da Apple

  1. Crie uma conta de desenvolvedor da Apple se ainda não tiver uma.

  2. Na página de configurações do projeto do console do Firebase, verifique se o aplicativo iOS está configurado corretamente com o ID da App Store e o ID da equipe.

  3. No site do desenvolvedor da Apple, crie um perfil de provisionamento para seu aplicativo com o recurso de domínio associado ativado.

  4. No Xcode, faça o seguinte:

    1. Abra seu aplicativo no cabeçalho TARGETS .

    2. Na página Assinatura e recursos, certifique-se de que sua equipe esteja registrada e que seu perfil de provisionamento esteja definido.

    3. Adicione o domínio que você criou no console do Firebase aos domínios associados, prefixado com applinks: (por exemplo, applinks:example.page.link ).

    4. Na página Informações, adicione um Tipo de URL ao seu projeto. Defina o campo Esquemas de URL para o ID do pacote do seu aplicativo. (O Identifier pode ser Bundle ID ou o que você desejar.)

    5. Se você configurou um domínio personalizado para seu projeto do Firebase, adicione o prefixo do URL do link dinâmico no arquivo Info.plist do seu projeto iOS usando a chave 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: desative o uso da área de trabalho do iOS pelo SDK do Dynamic Links.

      Por padrão, o SDK de links dinâmicos usa a área de trabalho para melhorar a confiabilidade dos links diretos pós-instalação. Ao usar a área de trabalho, o Dynamic Links pode garantir que, quando um usuário abre um Dynamic Link, mas precisa instalar seu aplicativo primeiro, o usuário pode ir imediatamente para o conteúdo vinculado original ao abrir o aplicativo pela primeira vez após a instalação.

      A desvantagem disso é que o uso do pasteboard aciona uma notificação no iOS 14 e posterior. Assim, na primeira vez que os usuários abrirem seu aplicativo, se a área de trabalho contiver uma URL de link dinâmico, eles verão uma notificação de que seu aplicativo acessou a área de trabalho, o que pode causar confusão.

      Para desativar esse comportamento, edite o arquivo Info.plist do seu projeto Xcode e defina a chave FirebaseDeepLinkPasteboardRetrievalEnabled como NO .

Para lidar com um Dynamic Link em seu aplicativo, dois cenários exigem implementação.

Estado rescindido

Se o aplicativo for encerrado, o método FirebaseDynamicLinks.getInitialLink permitirá que você recupere o Dynamic Link que abriu o aplicativo.

Esta é uma solicitação assíncrona, portanto, faz sentido manipular um link antes de renderizar a lógica do aplicativo, como um navegador. Por exemplo, você pode lidar com isso na função main :

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

  // Get any initial links
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  runApp(MyApp(initialLink));
}

Dentro da lógica do seu aplicativo, você pode verificar se um link foi tratado e executar uma ação, por exemplo:

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

Como alternativa, se você deseja identificar se um Dynamic Link exato foi usado para abrir o aplicativo, passe-o para o método getDynamicLink :

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

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

Estado de fundo/primeiro plano

Enquanto o aplicativo está aberto, ou em segundo plano, você pode ouvir os eventos do Dynamic Links usando um manipulador de fluxo. O getter FirebaseDynamicLinks.onLink retorna um Stream contendo um PendingDynamicLinkData :

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