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

Обзор

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

  • Когда 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 (15 минут).

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

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

Реализация

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

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

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

Пример кода

Code dissect

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

    Реализуйте только onConversionDataSuccess and onConversionDataFail.
    Методы 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

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

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

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

📘

Важно

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

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

  • Перейдите по ссылке на вашем устройстве.
  • OneLink в соответствии с настройкой ссылки направляет вас либо в App Store, либо на сайт.
  • Установите приложение.

    Важно

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

Expected logs results

📘

Следующие журналы доступны, только если [включен отладочный режим].(https://dev.appsflyer.com/hc/docs/integrate-ios-sdk#enabling-debug-mode)

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

    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build 
    
  • Запускается API UDL:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Start DDL
    
  • UDL отправляет запрос сопоставления с данной установкой в службу AppsFlyer:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=c9a1d5b34d68e584d0db2a20f4049fb7cd2e785c3383bXXXXXXXXXXXXXXXXXXXXXXXX
    
  • UDL получает ответ и вызывает обратный вызов didResolveDeepLink со status=FOUND и данными ссылки 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":""}
    
  • GCD получает данные о конверсиях:

[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 вызывается с данными о конверсиях в качестве входных данных:
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-A02] -[basic_app.AppDelegate onConversionDataSuccess:]:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }