Расширенный отложенный диплинкинг для Android

Обзор

Расширенный отложенный диплинкинг позволяет использовать диплинкинг для новых пользователей в определенных сценариях:

  • Когда UDL возвращает NOT_FOUND even though a relevant install occurred.
    Main example for such a scenario:
    • Время между кликом и установкой превышает окно атрибуции UDL (15 минут).
  • Когда UDL возвращает FOUND , но в данные диплинкинга представляют собой отсутствующие параметры, которые не являются deep_link_value and deep_link_sub1-10.
    Основные примеры таких сценариев:
    • Переход по ссылке в сети с самостоятельной атрибуцией (SRN), например Meta Ads или Twitter.
    • Клик по ссылке, которая не содержит deep_link_value or deep_link_sub1-10 , используемые для диплинкинга, например старые ссылки, созданные до имеющегося значения deep_link_value , которые все еще используются.

Чтобы разрешить отложенный диплинкинг, когда UDL возвращает значение NOT_FOUND, onConversionDataSuccess должен проверить необходимость обработки отложенного диплинкинга.
onConversionDataSuccess является частью API для получения данных о конверсиях (GCD). Основным назначением является сбор данных о конверсиях внутри устройства.
В приведенном здесь примере использования onConversionDataSuccess использует преимущество того, что все параметры отложенного диплинкинга передаются в обратный вызов, поверх данных о конверсиях.

Необходимые условия

Реализация

  1. onConversionDataSuccess должен выявлять случаи, когда должен происходить отложенный диплинкинг, не обработанный UDL.

    См. подробный анализ кода

  2. onConversionDataSuccess должен направлять пользователя по назначению отложенного диплинкинга на основании параметров диплинкинга, переданных в обратный вызов.

Пример кода

Code dissect

  1. Реализуйте слушатель API для получения данных о конверсиях AppsFlyerConversionListener.

    Необходимо реализовать все методы слушателя, даже если onAppOpenAttribution and onAttributionFailure являются взаимоисключающими с UDL и не будут вызваны.

  2. Определите сценарии отложенного диплинкинга, отфильтровав полезные данные о конверсиях посредством:
    • af_status == Non-organic
    • is_first_launch == true
  3. При обнаружении отложенного диплинкинга отфильтруйте кейсы, уже обработанные UDL.
    В примере ниже все ссылки содержат deep_link_value.
    Рекомендуется установить для UDL флажок для сигнализации о том, что отложенный диплинкинг уже обрабатывается, а onConversionDataSuccess нужно пропустить.
  4. onConversionDataSuccess должен убедиться в том, что данные о конверсиях содержат параметры, используемые для направления пользователей внутри приложения. Например: fruit_name в примере ниже.
  5. Направьте пользователя по назначению отложенного диплинкинга.

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

⇲ Ссылки на Github: Java

Тестирование

📘

Важно

Следующий сценарий тестирования демонстрирует обработку отложенного диплинкинга из ссылок, содержащих пользовательские параметры, но не параметры deep_link_value and deep_link_sub1-10 .
Этот сценарий тестирования также подходит для всех случаев расширенного отложенного диплинкинга, описанных ранее.

Before you begin

Test link

Вы можете использовать имеющуюся ссылку OneLink или попросить своего маркетолога создать новую для тестирования. Можно использовать как короткие, так и длинные URL-адреса OneLink.

Добавление специальных параметров к ссылке

  • Используйте только домен и шаблон OneLink вашей ссылки, например: https://onelink-basic-app.onelink.me/H5hv.
  • Добавьте индивидуально настраиваемые параметры OneLink, помимо deep_link_value and deep_link_sub1-10, которые ожидаются в вашем приложении.
  • Параметры нужно добавить как параметры запроса.
    • Пример: https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23

Perform the test

  1. Перейдите по ссылке на вашем устройстве.
  2. OneLink в соответствии с настройкой ссылки направляет вас либо в Google Play, либо на сайт.
  3. Установите приложение.

    Важно

    • Если приложение находится в разработке и еще не загружено в магазин, появляется следующее изображение:
      drawing
    • Установите приложение из Android Studio или любого другого интерфейса IDE, который вы используете.
  4. UDL распознает отложенный диплинкинг, сопоставляет установку с кликом и получает параметры OneLink в обратный вызов onDeepLinking . UDL не найдет параметров для перенаправления и выйдет.
  5. onConversionDataSuccess осуществляется как обратный вызов с данными о конверсии, которые содержат как индивидуально настраиваемые параметры, так и данные атрибуции.
  6. onConversionDataSuccess устанавливает индивидуально настраиваемые параметры для маршрутизации пользователя внутри приложения.

Expected logs results

📘

Следующие журналы доступны, только если включен отладочный режим.

  • SDK инициализирован:

    D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
    
  • Следующий журнал относится к прямому диплинкингу, и его можно игнорировать в сценарии отложенного диплинкинга:

    D/AppsFlyer_6.9.0: No deep link detected
    
  • Запускается API UDL:

    D/AppsFlyer_6.9.0: [DDL] start
    
  • UDL отправляет запрос сопоставления с данной установкой в AppsFlyer:

    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 получает ответ и вызывает обратный вызов onDeepLinking со status=FOUND и данными ссылки 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"}
    
  • GCD получает данные о конверсиях:

GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
  • onConversionDataSuccess вызывается с данными о конверсиях в качестве входных данных:
 D/AppsFlyer_6.9.0: [GCD-A02] Calling onConversionDataSuccess with:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }