Liên kết Sâu Hợp nhất của Android

Khái quát: Liên kết sâu hợp nhất (UDL) cho phép bạn đưa người dùng mới và người dùng hiện có đến một hoạt động trong ứng dụng cụ thể (ví dụ: một trang cụ thể trong ứng dụng) ngay sau khi ứng dụng được mở.

📘

Bảo vệ quyền riêng tư 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, v.v.), chúng sẽ trả về giá trị rỗng.

Ví dụ chi tiết

Quy trình

Android UDL flow!

Quy trình này hoạt động như sau:

  1. Người dùng nhấp vào liên kết OneLink.
    • Nếu người dùng đã cài đặt ứng dụng, Liên kết Ứng dụng Android hoặc lược đồ URI sẽ mở ứng dụng.
    • Nếu người dùng chưa cài đặt ứng dụng thì họ sẽ được chuyển hướng đến cửa hàng ứng dụng và sau khi tải xuống, người dùng sẽ mở ứng dụng.
  2. Ứng dụng mở ra sẽ kích hoạt SDK AppsFlyer.
  3. SDK AppsFlyer sẽ chạy API UDL.
  4. API UDL truy xuất dữ liệu OneLink từ máy chủ AppsFlyer.
  5. The UDL API calls back the onDeepLinking() phương thức trong các thông số DeepLinkingListener class.
  6. The onDeepLinking() method gets a DeepLinkResult object.
  7. The DeepLinkResult object includes:
    • Trạng thái (Đã tìm thấy/Không tìm thấy/Lỗi)
    • A DeepLink object that carries the deep_link_value and deep_link_sub1-10 mà nhà phát triển sử dụng để định tuyến người dùng đến một hoạt động trong ứng dụng cụ thể, đây là mục tiêu chính của OneLink.

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

  • UDL yêu cầu AppsFlyer Android SDK V6.1 trở lên.

Lập kế hoạch

Khi thiết lập OneLink, nhà tiếp thị sử dụng các thông số để tạo liên kết và nhà phát triển tùy chỉnh hành vi của ứng dụng dựa trên các giá trị nhận được. Nhà phát triển có trách nhiệm đảm bảo các thông số được xử lý chính xác trong ứng dụng, cho cả định tuyến trong ứng dụng và cá nhân hóa dữ liệu trong liên kết.

Để lập kế hoạch OneLink:

  1. Nhận từ nhà tiếp thị hành vi mong đợi và trải nghiệm cá nhân mà người dùng có được khi họ nhấp vào URL.
  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.

Thực hiện

Thực hiện logic API UDL dựa trên các thông số và giá trị đã chọn.

  1. Sử dụng phương thức subscribeForDeepLink() (từ AppsFlyerLib), before calling start, to register the DeepLinkListener trình nghe.
  2. Đảm bảo bạn ghi đè hàm gọi lại onDeepLinking().
    onDeepLinking() chấp nhận làm đối số cho một 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 đối tượng chứa thông tin liên kết sâu và các hàm trợ giúp để dễ dàng truy xuất các giá trị từ các mã khoá OneLink phổ biến, ví dụ như 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.

📘

Lưu ý

onDeepLinking không được gọi ra khi ứng dụng đang chạy ngầm và LaunchMode của Ứng dụng không phải là tiêu chuẩn.
Để sửa lỗi này, hãy gọi ra phương thức setIntent(intent) phương thức để đặt giá trị ý định bên trong phương thức bị ghi đè onNewIntent nếu ứng dụng đang sử dụng LaunchMode không tiêu chuẩn.

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

Supporting legacy OneLink links

OneLink cũ là các liên kết không chứa các thông số được đề xuất cho UDL: deep_link_value and deep_link_sub1-10.
Thông thường, đây là những liên kết đã tồn tại và đang được sử dụng khi di chuyển từ các phương thức cũ sang UDL.
Người dùng tin tức sử dụng các liên kết cũ sẽ được xử lý bởi onConversionDataSuccess trong ngữ cảnh Liên kết Sâu bị Trì hoãn Mở rộng.
UDL xử lý liên kết sâu cho người dùng hiện có. Trong trường hợp này, bạn nên thêm hỗ trợ trong lệnh gọi lại UDL onDeepLinking cho các thông số cũ.
Ví dụ mã 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;
        }
    }
})

⇲ Liên kết Github: Java

Thử nghiệm liên kết sâu bị trì hoãn

Before you begin

  • Hoàn thành tích hợp UDL
  • Đăng ký thiết bị thử nghiệm
  • Bật chế độ gỡ lỗi trong ứng dụng
  • Đảm bảo ứng dụng chưa được cài đặt trên thiết bị của bạn
  • Yêu cầu nhà tiếp thị của bạn cung cấp mẫu OneLink.
    • Nó sẽ có dạng như thế này: https://onelink-basic-app.onelink.me/H5hv.
    • Ví dụ này sử dụng tên miền phụ OneLink onelink-basic-app.onelink.me và ID mẫu OneLink H5hv

The 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 một liên kết hiện có

  • 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ố OneLink 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, bạn sẽ thấy hình ảnh này:
      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 .

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ả so khớp với lượt 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\":\"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"}
    
    

Thử nghiệm liên kết sâu (Liên kết Ứng dụng Android)

Before you begin

Create the test link

Sử dụng cùng một phương thức như trong liên kết sâu bị trì hoãn.

Perform the test

  1. Nhấp vào liên kết trên thiết bị của bạn.
  2. UDL phát hiện Liên kết Ứng dụng Android và truy xuất các thông số OneLink để gọi lại onDeepLinking .

Expected logs results

📘

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

  • Nếu liên kết là liên kết rút gọn OneLink (ví dụ: 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 gọi ra 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":"{\"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"}
    

📘

Mách nhỏ

Nếu khi nhấp vào Liên kết Ứng dụng Android, HĐH hiển thị Hộp thoại Định hướng hoặc chuyển hướng đến Google Play hoặc một trang web, hãy kiểm tra xem chữ ký SHA256 có đúng hay không.

  1. Use adb để lấy chữ ký ứng dụng trên thiết bị:
adb shell pm get-app-links <PACKAGE_NAME>

-2. Đảm bảo miền phụ là verified.
adb verified!

  1. Nếu miền phụ chưa được xác minh, nó sẽ hiển thị 1024.
    adb verified!