Receber Dynamic Links no iOS

Para receber o Firebase Dynamic Links que você criou, inclua o SDK Dynamic Links no app e chame os métodos handleUniversalLink: e dynamicLinkFromCustomSchemeURL: quando o app for carregado para receber os dados transmitidos no Dynamic Link.

Pré-requisitos

Antes de começar, adicione o Firebase ao seu projeto do iOS.

Use o Swift Package Manager para instalar e gerenciar as dependências do Firebase.

  1. No Xcode, com seu projeto do app aberto, navegue até File > Add Packages.
  2. Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Escolha a biblioteca Dynamic Links.
  5. Adicione a sinalização -ObjC à seção Outras sinalizações do vinculador das configurações de compilação do destino.
  6. Para uma experiência ideal com o Dynamic Links, recomendamos ativar o Google Analytics no seu projeto e adicionar o SDK do Firebase para Analytics ao seu app. Você pode selecionar a biblioteca com ou sem o recurso de coleta de IDFAs.
  7. Quando terminar, o Xcode começará a resolver e fazer o download das dependências em segundo plano automaticamente.

Agora execute algumas etapas de configuração:

  1. No console do Firebase, abra a seção Dynamic Links. Se solicitado, aceite os Termos de Serviço.
  2. Verifique se o ID da App Store e o prefixo do ID do app estão especificados nas configurações do aplicativo. Para visualizar e editar as configurações do app, acesse a página Configurações do projeto Firebase e selecione o app iOS.

    Para confirmar se o projeto do Firebase está configurado corretamente para usar o Dynamic Links no app para iOS, abra o seguinte URL:

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

    Se o app estiver conectado, o arquivo apple-app-site-association conterá uma referência ao prefixo do ID do app e ao ID do pacote do app. Exemplo:

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

    Se o campo details estiver vazio, verifique novamente se você especificou o prefixo do ID do app. Pode ser que ele não seja igual ao código da sua equipe.

  3. Opcional: desativar o uso do SDK Dynamic Links na área de transferência do iOS.

    Por padrão, o SDK do Dynamic Links usa a área de transferência para melhorar a confiabilidade dos links diretos pós-instalação. Ao usar a área de transferência, o Dynamic Links garante que, quando um usuário abrir um Dynamic Link, mas precisar instalar o app primeiro, o usuário poderá acessar imediatamente o conteúdo vinculado original ao abrir o app pela primeira vez.

    A desvantagem disso é que o uso da área de trabalho aciona uma notificação no iOS 14 e em versões posteriores. Dessa forma, na primeira vez que os usuários abrirem seu app, se a área de transferência tiver um URL, eles verão uma notificação informando que o app acessou a área de transferência, o que pode causar problemas.

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

  1. Na guia Info do projeto Xcode do seu app, crie um novo tipo de URL a ser usado para Dynamic Links. Defina o campo Identifier como um valor exclusivo e o campo URL scheme para ser seu identificador do pacote, que é o esquema de URL padrão usado pelo Dynamic Links.
  2. Na guia Capabilities do projeto Xcode do seu app, ative "Domínios associados" e adicione o seguinte à lista Associated Domains:
    applinks:your_dynamic_links_domain
  3. Se você quiser receber Dynamic Links com um domínio totalmente personalizado, no arquivo Info.plist do projeto Xcode, crie uma chave chamada FirebaseDynamicLinksCustomDomains e defina-a para os prefixos Dynamic Links de URL. Exemplo:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. Importe o módulo FirebaseCore no UIApplicationDelegate, assim como qualquer outro módulo do Firebase usado pelo delegado do app. Por exemplo, para usar Cloud Firestore, Authentication e:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. Configure uma instância compartilhada do FirebaseApp no método application(_:didFinishLaunchingWithOptions:) do delegado do app:

    SwiftUI

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. Se você estiver usando a SwiftUI, crie um delegado do aplicativo e o anexe ao struct App via UIApplicationDelegateAdaptor ou NSApplicationDelegateAdaptor. Também é necessário desativar o swizzling do delegado do app. Para mais informações, consulte as instruções da SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. Em seguida, no método application:continueUserActivity:restorationHandler: , processe os links recebidos como links universais quando o aplicativo já estiver instalado:

    Swift

    Observação: este produto não está disponível para destinos macOS, Mac Catalyst, tvOS ou watchOS.
    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

    Observação: este produto não está disponível para destinos macOS, Mac Catalyst, tvOS ou watchOS.
    - (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;
    }
  8. Por fim, no application:openURL:options:, processe os links recebidos pelo esquema de URL personalizado do seu app. Esse método é chamado quando o app é aberto pela primeira vez após a instalação.

    Se o Dynamic Link não for encontrado na primeira inicialização do app, esse método será chamado com o url do DynamicLink definido como nil, indicando que o SDK não conseguiu encontrar um Dynamic Link pendente correspondente.

    Swift

    Observação: este produto não está disponível para destinos macOS, Mac Catalyst, tvOS ou watchOS.
    @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

    Observação: este produto não está disponível para destinos macOS, Mac Catalyst, tvOS ou watchOS.
    - (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;
    }