Deferred deep linking estendido do Android

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 é 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. Implementar o ouvinte da API Get Conversion Data AppsFlyerConversionListener.

    Todos os métodos do ouvinte devem ser implementados, mesmo que 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 sinalize com um sinalizador que o deferred deep linking já foi tratado 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

    AppsFlyerConversionListener conversionListener =  new AppsFlyerConversionListener() {
        @Override
        public void onConversionDataSuccess(Map<String, Object> conversionDataMap) {
            String status = Objects.requireNonNull(conversionDataMap.get("af_status")).toString();
            if(status.equals("Non-organic")){
                if( Objects.requireNonNull(conversionDataMap.get("is_first_launch")).toString().equals("true")){
                    Log.d(LOG_TAG,"Conversion: First Launch");
                    //Deferred deep link in case of a legacy link
                    if(conversionDataMap.containsKey("fruit_name")){
                        if (conversionDataMap.containsKey("deep_link_value")) { //Not legacy link
                            Log.d(LOG_TAG,"onConversionDataSuccess: Link contains deep_link_value, deep linking with UDL");
                        }
                        else{ //Legacy link
                            conversionDataMap.put("deep_link_value", conversionDataMap.get("fruit_name"));
                            String fruitNameStr = (String) conversionDataMap.get("fruit_name");
                            DeepLink deepLinkData = mapToDeepLinkObject(conversionDataMap);
                            goToFruit(fruitNameStr, deepLinkData);
                        }
                    }
                } else {
                    Log.d(LOG_TAG,"Conversion: Not First Launch");
                }
            } else {
                Log.d(LOG_TAG, "Conversion: This is an organic install.");
            }
        }

        @Override
        public void onConversionDataFail(String errorMessage) {
            Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
        }

        @Override
        public void onAppOpenAttribution(Map<String, String> attributionData) {
            Log.d(LOG_TAG, "onAppOpenAttribution: This is fake call.");
        }

        @Override
        public void onAttributionFailure(String errorMessage) {
            Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
        }
    };

⇲ Links do Github: Java

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

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

  1. Clique no link no seu dispositivo.
  2. O OneLink redireciona você de acordo com a configuração do link para o Google Play ou um site.
  3. 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 Android Studio ou qualquer outro IDE que você usa.
  4. O UDL detecta o deferred deep linking, corresponde a instalação ao clique e recupera os parâmetros do OneLink para o callback onDeepLinking . UDL não encontrará nenhum parâmetro para rotear e sair.
  5. onConversionDataSuccess callback é chamado com os dados de conversão, que contém parâmetros personalizados e dados de atribuição.
  6. 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 apenas quando o modo de depuração está ativado.

  • SDK inicializado:

    D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
    
  • O registro a seguir refere-se a deep links diretos e pode ser ignorado em um cenário de deferred deep linking:

    D/AppsFlyer_6.9.0: No deep link detected
    
  • A API UDL começa:

    D/AppsFlyer_6.9.0: [DDL] start
    
  • O UDL envia uma consulta à AppsFlyer para consultar uma correspondência com esta instalação:

    D/AppsFlyer_6.9.0: [DDL] Preparing request 1
    ...
    I/AppsFlyer_6.9.0: call = https://dlsdk.appsflyer.com/v1.0/android/com.appsflyer.onelink.appsflyeronelinkbasicapp?af_sig=<>&sdk_version=6.9; size = 239 bytes; body = {
          ...
          TRUNCATED
          ...
    }
    
  • UDL obteve uma resposta e chama o callback onDeepLinking com status=FOUND e dados de link do OneLink:

    D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with:
      {"deepLink":"{\"campaign_id\":\"\",\"af_sub3\":\"\",\"match_type\":\"probabilistic\",\"af_sub1\":\"\",\"deep_link_value\":\"\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-07T09:32:52.256\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"is_deferred\":true}","status":"FOUND"}
    
  • O GCD está buscando os dados de conversão:

GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
  • onConversionDataSuccess é chamado com dados de conversão como entrada:
 D/AppsFlyer_6.9.0: [GCD-A02] Calling onConversionDataSuccess with:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }