Унифицированный диплинкинг для Android

Краткий обзор. Унифицированный диплинкинг (Unified Deep Linking, UDL) позволяет при открытии приложения направлять новых и существующих пользователей на определенную активность в приложении (например, на конкретную страницу).

📘

Обеспечение конфиденциальности UDL

For new users, the UDL method only returns parameters relevant to deferred deep linking: deep_link_value and deep_link_sub1-10. If you try to get any other parameters (media_source, campaign, af_sub1-5и т.д.), они возвращают значение null.

Пошаговый пример

Схема работы

Android UDL flow!

Схема работы:

  1. Пользователь нажимает ссылку OneLink.
    • Если у пользователя уже установлено приложение, оно будет открыто с помощью Android App Links или схемы URI.
    • Если у пользователя нет приложения, он перенаправляется в магазин приложений, скачивает и открывает приложение.
  2. При открытии приложения запускается SDK AppsFlyer.
  3. SDK AppsFlyer запускает API UDL.
  4. API UDL получает данные OneLink с серверов AppsFlyer.
  5. The UDL API calls back the onDeepLinking() метод в DeepLinkingListener class.
  6. The onDeepLinking() method gets a DeepLinkResult object.
  7. The DeepLinkResult object includes:
    • Статус (найден / не найден / ошибка)
    • A DeepLink object that carries the deep_link_value and deep_link_sub1-10 используемый разработчиком для перенаправления пользователя на определенную активность в приложении, что является основной целью OneLink.

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

  • Для UDL нужен SDK AppsFlyer для Android версии 6.1+.

Планирование

При настройке ссылок OneLink маркетолог использует параметры для создания ссылок, а разработчик настраивает поведение приложения на основе полученных значений. Задача разработчика — убедиться, что эти параметры корректно обрабатываются в приложении, как с точки зрения внутренней маршрутизации, так и с точки зрения персонализации данных в ссылке.

Для планирования ссылок OneLink:

  1. Выясните у маркетолога, какими должны быть поведение и персонализация пользовательского интерфейса при клике.
  2. Based on the desired behavior, plan the deep_link_value and other parameters that are needed to give the user the desired personal experience.
    • The deep_link_value is set by the marketer in the URL and used by the developer to redirect the user to a specific place inside the app. For example, if you have a fruit store and want to direct users to apples, the value of deep_link_value can be apples.
    • The deep_link_sub1-10 parameters can also be added to the URL to help personalize the user experience. For example, to give a 10% discount, the value of deep_link_sub1 can be 10.

Реализация

Внедрите логику API UDL на основе выбранных параметров и значений.

  1. Используйте subscribeForDeepLink() метод (из AppsFlyerLib), before calling start, to register the DeepLinkListener прослушиватель интерфейса.
  2. Убедитесь, что вы переопределили функцию обратного вызова onDeepLinking().
    onDeepLinking() принимает в качестве аргумента объект DeepLinkResult object.
  3. Use getStatus() to query whether the deep linking match is found.
  4. For when the status is an error, call getError() and run your error flow.
  5. For when the status is found, use getDeepLink() to retrieve the DeepLink object.
    The DeepLink Объект содержит информацию о диплинкинге и вспомогательные функции, позволяющие извлекать значения из хорошо известных ключей OneLink, например, getDeepLinkValue().
  6. Use getDeepLinkValue() to retrieve the deep_link_value.
  7. Use getStringValue("deep_link_sub1") to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  8. Once deep_link_value and deep_link_sub1-10 are retrieved, pass them to an in-app router and use them to personalize the user experience.

📘

Примечание

onDeepLinking не вызывается, когда приложение работает в фоновом режиме, и режим запуска приложения Application LaunchMode не является стандартным.
Чтобы исправить это, вызовите метод setIntent(intent) , чтобы установить значение намерения внутри переопределенного метода onNewIntent , если предложение использует нестандартный режим запуска LaunchMode.

       import android.content.Intent;
       ...
       ...
       ...
       @Override
       protected void onNewIntent(Intent intent) 
       { 
          super.onNewIntent(intent);     
          setIntent(intent);
       }

Supporting legacy OneLink links

Устаревшие ссылки OneLink — это ссылки, которые не содержат рекомендованные для UDL параметры: deep_link_value and deep_link_sub1-10.
Обычно это ссылки, которые уже существуют и используются при переходе от устаревших методов к UDL.
Новые пользователи, использующие устаревшие ссылки, обрабатываются посредством onConversionDataSuccess в контексте расширенного отложенного диплинкинга.
UDL обрабатывает диплинкинг для имеющихся пользователей. В этом случае рекомендуется добавить поддержку в обратный вызов UDL onDeepLinking для устаревших параметров.
Пример кода Java

Code example

appsflyer.subscribForDeepLink(new DeepLinkListen
    @Override
    public void onDeepLinking(@NonNull DeepLinkResult deepLinkResult) {
        DeepLinkResult.Status dlStatus = deepLinkResult.getStatus();
        if (dlStatus == DeepLinkResult.Status.FOUND) {
            Log.d(LOG_TAG, "Deep link found");
        } else if (dlStatus == DeepLinkResult.Status.NOT_FOUND) {
            Log.d(LOG_TAG, "Deep link not found");
            return;
        } else {
            // dlStatus == DeepLinkResult.Status.ERROR
            DeepLinkResult.Error dlError = deepLinkResult.getError();
            Log.d(LOG_TAG, "There was an error getting Deep Link data: " + dlError.toString());
            return;
        }
        DeepLink deepLinkObj = deepLinkResult.getDeepLink();
        try {
            Log.d(LOG_TAG, "The DeepLink data is: " + deepLinkObj.toString());
        } catch (Exception e) {
            Log.d(LOG_TAG, "DeepLink data came back null");
            return;
        }
        // An example for using is_deferred
        if (deepLinkObj.isDeferred()) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }
        
        // ** Next if statement is optional **
        // Our sample app's user-invite carries the referrerID in deep_link_sub2
        // See the user-invite section in FruitActivity.java
        if (dlData.has("deep_link_sub2")){
            referrerId = deepLinkObj.getStringValue("deep_link_sub2");
            Log.d(LOG_TAG, "The referrerID is: " + referrerId);
        } else {
            Log.d(LOG_TAG, "deep_link_sub2/Referrer ID not found");
        }
        // An example for using a generic getter
        String fruitName = "";
        try {
            fruitName = deepLinkObj.getDeepLinkValue();
            Log.d(LOG_TAG, "The DeepLink will route to: " + fruitName);
        } catch (Exception e) {
            Log.d(LOG_TAG, "Custom param fruit_name was not found in DeepLink data");
            return;
        }
        goToFruit(fruitName, deepLinkObj);
    }
});
AppsFlyerLib.getInstance().subscribeForDeepLink(object : DeepLinkListener{
    override fun onDeepLinking(deepLinkResult: DeepLinkResult) {
        when (deepLinkResult.status) {
            DeepLinkResult.Status.FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link found"
                )
            }
            DeepLinkResult.Status.NOT_FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link not found"
                )
                return
            }
            else -> {
                // dlStatus == DeepLinkResult.Status.ERROR
                val dlError = deepLinkResult.error
                Log.d(
                    LOG_TAG,"There was an error getting Deep Link data: $dlError"
                )
                return
            }
        }
        var deepLinkObj: DeepLink = deepLinkResult.deepLink
        try {
            Log.d(
                LOG_TAG,"The DeepLink data is: $deepLinkObj"
            )
        } catch (e: Exception) {
            Log.d(
                LOG_TAG,"DeepLink data came back null"
            )
            return
        }

        // An example for using is_deferred
        if (deepLinkObj.isDeferred == true) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }

        try {
            val fruitName = deepLinkObj.deepLinkValue
            Log.d(LOG_TAG, "The DeepLink will route to: $fruitName")
        } catch (e:Exception) {
            Log.d(LOG_TAG, "There's been an error: $e");
            return;
        }
    }
})

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

Тестирование отложенного диплинкинга

Before you begin

The 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 .

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\":\"apples\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-06T11:47:40.037\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"deep_link_sub1\":\"23\",\"is_deferred\":true}","status":"FOUND"}
    
    

Тестирование диплинкинга (Android App Links)

Before you begin

Create the test link

Используйте тот же метод, что и в отложенном диплинкинге.

Perform the test

  1. Перейдите по ссылке на вашем устройстве.
  2. UDL распознает Android App Link и получает параметры OneLink в обратный вызов onDeepLinking .

Expected logs results

📘

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

  • Если ссылка представляет собой короткую ссылку OneLink (например, https://onelink-basic-app.onelink.me/H5hv/apples)
    D/AppsFlyer_6.9.0: HTTP: [258990367] GET:https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples 
    
  • UDL вызывает обратный вызов onDeepLinking со status=FOUND и данными ссылки OneLink
    D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with:
        {"deepLink":"{\"path\":\"\\\/H5hv\",\"scheme\":\"https\",\"link\":\"https:\\\/\\\/onelink-basic-app.onelink.me\\\/H5hv?deep_link_value=apples&deep_link_sub1=23\",\"host\":\"onelink-basic-app.onelink.me\",\"deep_link_sub1\":\"23\",\"deep_link_value\":\"apples\",\"is_deferred\":false}","status":"FOUND"}
    

📘

Совет

Если при переходе по Android App Link ОС показывает диалоговое окно устранения неоднозначности или перенаправляет на Google Play или сайт, проверьте правильность подписи SHA256.

  1. Use adb , чтобы получить подпись приложения на устройство:
adb shell pm get-app-links <PACKAGE_NAME>

-2. Убедитесь, что поддомен имеет значение verified.
adb verified!

  1. Если поддомен не проверен, он показывает 1024.
    adb verified!