Liên kết Sâu bị Trì hoãn Mở rộng của Android

Tổng quan

Liên kết sâu bị trì hoãn mở rộng cho phép liên kết sâu cho người dùng mới trong một số trường hợp nhất định:

  • Khi UDL trả về NOT_FOUND even though a relevant install occurred.
    Main example for such a scenario:
    • Thời gian giữa thời điểm nhấp chuột và cài đặt vượt quá khung thời gian xem lại UDL (15 phút).
  • Khi UDL trả về FOUND nhưng dữ liệu liên kết sâu bị thiếu thông số, không phải là deep_link_value and deep_link_sub1-10.
    Các ví dụ chính cho các tình huống như vậy:
    • Clicking a link in a Self Reporting Network (SRN), like Meta ads or Twitter.
    • Nhấp vào một liên kết không chứa deep_link_value or deep_link_sub1-10 được sử dụng để liên kết sâu, ví dụ như các liên kết cũ được tạo trước khi deep_link_value tồn tại vẫn đang được sử dụng.

Để cho phép liên kết sâu bị trì hoãn khi UDL trả về NOT_FOUND, onConversionDataSuccess lệnh gọi lại cần kiểm tra xem nó có nên xử lý liên kết sâu bị trì hoãn hay không.
onConversionDataSuccess là một phần của API Lấy Dữ liệu Chuyển đổi (GCD). Mục đích chính của nó là thu thập dữ liệu chuyển đổi bên trong thiết bị.
Trong trường hợp sử dụng được nêu ở đây onConversionDataSuccess tận dụng thực tế là tất cả các thông số liên kết sâu bị trì hoãn đều được chuyển đến lệnh gọi lại, bên trên dữ liệu chuyển đổi.

Điều kiện tiên quyết

Thực hiện

  1. onConversionDataSuccess nên phát hiện các trường hợp xảy ra liên kết sâu bị trì hoãn mà UDL không xử lý.

    Xem phân tích mã chi tiết

  2. onConversionDataSuccess nên định tuyến người dùng đến đích liên kết sâu bị trì hoãn dựa trên các thông số liên kết sâu được chuyển đến lệnh gọi lại.

Ví dụ về mã

Code dissect

  1. Triển khai trình nghe API Nhận Dữ liệu Chuyển đổi AppsFlyerConversionListener.

    Mặc dù tất cả các phương thức của trình nghe phải được thực hiện onAppOpenAttribution and onAttributionFailure loại trừ lẫn nhau với UDL và sẽ không được gọi ra.

  2. Phát hiện các tình huống liên kết sâu bị trì hoãn bằng cách lọc tải trọng dữ liệu chuyển đổi bằng:
    • af_status == Non-organic
    • is_first_launch == true
  3. Khi phát hiện liên kết sâu bị trì hoãn, hãy lọc ra các trường hợp đã được UDL xử lý.
    Trong ví dụ sau, tất cả các liên kết chứa deep_link_value.
    UDL nên báo hiệu bằng cờ báo cho biết liên kết sâu bị trì hoãn đã được xử lý và onConversionDataSuccess nên bỏ qua.
  4. onConversionDataSuccess phải xác minh dữ liệu chuyển đổi chứa các thông số được sử dụng để định tuyến người dùng bên trong ứng dụng. Ví dụ: fruit_name trong ví dụ sau đây.
  5. Định tuyến người dùng đến đích liên kết sâu bị trì hoãn.

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

⇲ Liên kết Github: Java

Thử nghiệm

📘

Quan trọng

Trường hợp thử nghiệm sau đây minh họa việc xử lý liên kết sâu bị trì hoãn từ các liên kết có chứa thông số tùy chỉnh nhưng không chứa thông số deep_link_value and deep_link_sub1-10 .
Trường hợp thử nghiệm này cũng phù hợp với tất cả liên kết sâu bị trì hoãn mở rộng được mô tả trước đó.

Before you begin

Test link

Bạn có thể sử dụng một liên kết OneLink hiện có hoặc yêu cầu nhà tiếp thị tạo một liên kết mới để thử nghiệm. Có thể sử dụng cả URL OneLink rút gọn và đầy đủ.

Thêm thông số đặc biệt vào liên kết

  • Chỉ sử dụng miền và mẫu OneLink của liên kết của bạn, ví dụ: https://onelink-basic-app.onelink.me/H5hv.
  • Thêm thông số tùy chỉnh OneLink ngoài deep_link_value and deep_link_sub1-10, như ứng dụng của bạn dự kiến.
  • Các thông số nên được thêm dưới dạng thông số truy vấn.
    • Ví dụ: https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23

Perform the test

  1. Nhấp vào liên kết trên thiết bị của bạn.
  2. OneLink chuyển hướng bạn theo thiết lập liên kết, tới Google Play hoặc một trang web.
  3. Cài đặt ứng dụng.

    Quan trọng

    • Nếu ứng dụng vẫn đang được phát triển và chưa được tải lên cửa hàng, hình ảnh sau sẽ hiển thị:
      drawing
    • Cài đặt ứng dụng từ Android Studio hoặc bất kỳ IDE nào khác mà bạn sử dụng.
  4. UDL phát hiện liên kết sâu bị trì hoãn, so khớp lượt cài đặt với lượt nhấp và truy xuất các thông số OneLink cho lệnh gọi lại onDeepLinking . UDL sẽ không tìm thấy bất kỳ thông số nào để định tuyến và thoát.
  5. onConversionDataSuccess lệnh gọi lại được gọi ra với dữ liệu chuyển đổi chứa cả thông số tùy chỉnh và dữ liệu phân bổ.
  6. onConversionDataSuccess đặt các thông số tùy chỉnh để định tuyến người dùng bên trong ứng dụng.

Expected logs results

📘

Các nhật ký sau chỉ khả dụng khi chế độ gỡ lỗi được bật.

  • Đã khởi tạo SDK:

    D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
    
  • Nhật ký sau đề cập đến liên kết sâu trực tiếp và có thể được bỏ qua trong trường hợp liên kết sâu bị trì hoãn:

    D/AppsFlyer_6.9.0: No deep link detected
    
  • API UDL bắt đầu:

    D/AppsFlyer_6.9.0: [DDL] start
    
  • UDL gửi truy vấn tới AppsFlyer để truy vấn kết quả khớp với cài đặt này:

    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 đã nhận được phản hồi và gọi lệnh gọi lại onDeepLinking với status=FOUND và dữ liệu liên kết 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 đang tìm nạp dữ liệu chuyển đổi:

GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
  • onConversionDataSuccess được gọi ra với dữ liệu chuyển đổi làm đầu vào:
 D/AppsFlyer_6.9.0: [GCD-A02] Calling onConversionDataSuccess with:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }