Deferred deep linking estendido do iOS

Visão Geral

O deferred deep linking permite deep links para novos usuários em determinados cenários:

  • Quando o UDL retornar NOT_FOUND mesmo que tenha ocorrido uma instalação relevante.
  • Quando o UDL retornar FOUND mas os dados de deep linking não têm parâmetros, que não são deep_link_value and deep_link_sub1-10.
    Exemplos principais para tais cenários:
    • Clicar em um link em uma rede de auto-relato (SRN), como Facebook ou Twitter.
    • Clicar em um link que não contém deep_link_value or deep_link_sub1-10 usado para deep linking, por exemplo, links antigos criados antes de deep_link_value que ainda estão em uso.
    • O tempo entre o clique e a instalação excede a janela de lookback do UDL (15 minutos).

Para permitir deferred deep linking quando o UDL retornar NOT_FOUND, onConversionDataSuccess deve verificar se deve lidar com o deferred deep linking.
onConversionDataSuccess faz parte da API Get Conversion Data (GCD). Seu principal objetivo era coletar dados de conversão dentro do dispositivo.
No caso de uso descrito aqui onConversionDataSuccess aproveita o fato de que todos os parâmetros de deferred deep linking serem passados para o callback, além dos dados de conversão.

Pré-requisitos

Implementação

  1. onConversionDataSuccess deve detectar casos em que devem ocorrer deferred deep linking que o UDL não manipulou.

    Veja a dissecação detalhada do código

  2. onConversionDataSuccess deve encaminhar o usuário para o destino de deferred deep linking com base nos parâmetros de deep linking passados para o callback.

Exemplo de código

Code dissect

  1. Implemente o representante da API Get Conversion Data AppsFlyerLibDelegate.

    Apenas implementar onConversionDataSuccess and onConversionDataFail.
    Os métodos onAppOpenAttribution and onAttributionFailure são mutuamente exclusivos com UDL e não serão chamados.

  2. Detecte cenários de deferred deep linking filtrando a carga de dados de conversão com:
    • af_status == Non-Organic
    • is_first_launch == true
  3. Quando deferred deep linking forem detectados, filtre os casos que já foram tratados pelo UDL.
    No exemplo a seguir, todos os links contêm deep_link_value.
    Recomenda-se que o UDL avise com um sinalizador que o deferred deep linking já foi manipulado e onConversionDataSuccess deve ser pulado.
  4. onConversionDataSuccess deve verificar se os dados de conversão contêm parâmetros usados para rotear usuários dentro do aplicativo. Por exemplo fruit_name no exemplo a seguir.
  5. Encaminhe o usuário para o destino do deferred deep linking.

Code snippet

extension AppDelegate: AppsFlyerLibDelegate {
     
    // Handle Organic/Non-organic installation
    func onConversionDataSuccess(_ data: [AnyHashable: Any]) {
        ConversionData = data
        print("onConversionDataSuccess data:")
        for (key, value) in data {
            print(key, ":", value)
        }
        if let conversionData = data as NSDictionary? as! [String:Any]? {
        
            if let status = conversionData["af_status"] as? String {
                if (status == "Non-organic") {
                    if let sourceID = conversionData["media_source"],
                        let campaign = conversionData["campaign"] {
                        NSLog("[AFSDK] This is a Non-Organic install. Media source: \(sourceID)  Campaign: \(campaign)")
                    }
                } else {
                    NSLog("[AFSDK] This is an organic install.")
                }
                
                if let is_first_launch = conversionData["is_first_launch"] as? Bool,
                    is_first_launch {
                    NSLog("[AFSDK] First Launch")
                    if !conversionData.keys.contains("deep_link_value") && conversionData.keys.contains("fruit_name"){
                        switch conversionData["fruit_name"] {
                            case let fruitNameStr as String:
                            NSLog("This is a deferred deep link opened using conversion data")
                            walkToSceneWithParams(fruitName: fruitNameStr, deepLinkData: conversionData)
                            default:
                                NSLog("Could not extract deep_link_value or fruit_name from deep link object using conversion data")
                                return
                        }
                    }
                } else {
                    NSLog("[AFSDK] Not First Launch")
                }
            }
        }
    }
    
    func onConversionDataFail(_ error: Error) {
        NSLog("[AFSDK] \(error)")
    }
}

⇲ Links do Github: Swift

Testes

📘

Importante

O cenário de teste a seguir demonstra o tratamento de deferred deep linking de links que contêm parâmetros personalizados, mas não parâmetros deep_link_value and deep_link_sub1-10 .
Este cenário de teste também é relevante para todos os deferred deep linking estendidos descritos anteriormente.

Before you begin

The test link

Você pode usar um link do OneLink existente ou pedir ao seu profissional de marketing para criar um novo para teste. Podem ser usadas URLs curtas e longas do OneLink.

Adicionando parâmetros ad hoc ao link

  • Use apenas o domínio e template do OneLink do seu link, por exemplo: https://onelink-basic-app.onelink.me/H5hv.
  • Adicionar parâmetros personalizados do OneLink diferentes de deep_link_value and deep_link_sub1-10, conforme esperado pelo seu aplicativo.
  • Os parâmetros devem ser adicionados como parâmetros de consulta .
    • Exemplo: https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23

Perform the test

  • Clique no link no seu dispositivo.
  • O OneLink redireciona você de acordo com a configuração do link para acessar a App Store ou um site.
  • Instale o aplicativo.

    Importante

    • Se o aplicativo ainda estiver em desenvolvimento e ainda não tiver sido carregado na loja, a seguinte imagem será exibida:
      drawing
    • Instale o aplicativo do Xcode ou de qualquer outro IDE que você usar.
  • O UDL detecta o deferred deep linking, corresponde a instalação ao clique e recupera os parâmetros do OneLink para o callback didResolveDeepLink . UDL não encontrará nenhum parâmetro para rotear e sair.
  • onConversionDataSuccess callback é chamado com os dados de conversão, que contém parâmetros personalizados e dados de atribuição.
  • onConversionDataSuccess define os parâmetros personalizados para rotear o usuário dentro do aplicativo.

Expected logs results

📘

Os logs a seguir estão disponíveis somente quando [modo de depuração está ativado].(https://dev.appsflyer.com/hc/docs/integrate-ios-sdk#enabling-debug-mode)

  • SDK inicializado:

    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build 
    
  • A API UDL começa:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Start DDL
    
  • O UDL envia consulta ao serviço AppsFlyer para consultar uma correspondência com esta instalação:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=c9a1d5b34d68e584d0db2a20f4049fb7cd2e785c3383bXXXXXXXXXXXXXXXXXXXXXXXX
    
  • UDL obteve uma resposta e chama o callback didResolveDeepLink com status=FOUND e dados de link do OneLink:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":"","click_http_referrer":"","af_sub1":"","click_event":{"af_sub4":"","click_http_referrer":"","af_sub1":"","af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","af_sub2":""},"af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
    
  • O GCD está buscando os dados de conversão:

[AppsFlyerSDK] [com.appsflyer.serial] [GCD-B01] GCD 4.0 URL: https://gcdsdk.appsflyer.com/install_data/v4.0/id1512793879?devkey=s*****4&device_id=1672050642148-9221195
  • onConversionDataSuccess é chamado com dados de conversão como entrada:
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-A02] -[basic_app.AppDelegate onConversionDataSuccess:]:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }