Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Receber links dinâmicos no iOS

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

Pré-requisitos

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

  1. Adicione o Firebase ao projeto do iOS.
  2. Inclua o seguinte pod no seu Podfile:
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  3. Execute pod install e abra o arquivo .xcworkspace criado.
  4. No Console do Firebase, abra a seção Dynamic Links. Se solicitado, aceite os Termos de Serviço.
  5. Verifique se o código da App Store e o prefixo do código 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 do Firebase e selecione o app para iOS.

    Para confirmar se o projeto do Firebase está configurado corretamente para usar links dinâmicos 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":["/*"]}]}}

    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 ID da sua equipe.

  6. Opcional: desative o uso do SDK do 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, os Dynamic Links garantem que, quando um usuário abrir um link dinâmico, mas precisar instalar seu app primeiro, o usuário poderá acessar imediatamente o conteúdo vinculado original ao abri-lo 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 de link dinâmico, eles verão uma notificação de que o aplicativo acessou a área de transferência, o que pode causar confusão.

    Para desativar este comportamento, edite o arquivo Info.plist 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 links dinâmicos. 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 de URL dos Dynamic Links do app. Exemplo:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Importe o módulo do Firebase no UIApplicationDelegate:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  5. Configure uma instância compartilhada do FirebaseApp, normalmente no método application:didFinishLaunchingWithOptions: do app.

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. Em seguida, no método application:continueUserActivity:restorationHandler: , processe os links recebidos como links universais quando o app já estiver instalado (no iOS 9 e versões mais recentes):

    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 fim, nos métodos application:openURL:sourceApplication:annotation: (iOS 8 e versões anteriores) e application:openURL:options: (iOS 9 e versões mais recentes), processe os links recebidos por meio do esquema de URL personalizado do seu app. Esses métodos são chamados quando o app recebe um link no iOS 8 e anteriores e quando ele é aberto pela primeira vez após a instalação em qualquer versão do iOS.

    Se o link dinâmico não for encontrado na primeira inicialização do app (em qualquer versão do iOS), esse método será chamado com o url do FIRDynamicLink definido como nil, indicando que o SDK não conseguiu encontrar um link dinâmico pendente.

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