API Cũ của Android

Liên kết sâu trực tiếp

Overview

Liên kết sâu trực tiếp chuyển hướng người dùng di động vào một hoạt động hoặc nội dung cụ thể trong ứng dụng khi ứng dụng đã được cài đặt.

Việc định tuyến trong ứng dụng này tới một hoạt động cụ thể trong ứng dụng có thể do các thông số được chuyển qua cho ứng dụng khi HĐH mở ứng dụng và onAppOpenAttribution method is called. AppsFlyer's OneLink ensures that the correct value is passed along with the user's click, thus personalizing the user’s app experience.

Only the deep_link_value is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data.

Luồng liên kết sâu trực tiếp hoạt động như sau:

Direct Deep Linking flow

  1. Người dùng nhấp vào URL rút gọn OneLink.
  2. Android khởi chạy ứng dụng dựa trên hoạt động có liên quan trong AndroidManifest.xml.
  3. AppsFlyer SDK được kích hoạt trong ứng dụng.
  4. AppsFlyer SDK truy xuất dữ liệu OneLink.
    • Trong một URL rút gọn, dữ liệu được truy xuất từ API trình phân giải URL rút gọn trong máy chủ của AppsFlyer.
    • Trong một URL đầy đủ, dữ liệu được truy xuất trực tiếp từ URL đầy đủ.
  5. AppsFlyer SDK triggers onAppOpenAttribution() with the retrieved parameters and cached attribution parameters (e.g. install_time).
  6. Asynchronously, onConversionDataSuccess() is called, holding the full cached attribution data. (You can exit this function by checking if is_first_launch is true.)
  7. onAppOpenAttribution() sử dụng bản đồ attributionData để điều phối các hoạt động khác trong ứng dụng và chuyển các dữ liệu liên quan.
    • Điều này giúp tạo ra trải nghiệm được cá nhân hóa cho người dùng, đây là mục tiêu chính của OneLink.

Procedures

To implement the onAppOpenAttribution và thiết lập các hành vi thông số, thì phải hoàn thành danh sách kiểm tra các quy trình hành động sau đây.

Danh sách kiểm tra quy trình

  1. Quyết định hoạt động của ứng dụng và deep_link_value (and other parameter names and values) - with the marketer
  2. Lập kế hoạch giá trị đầu vào của phương thức, tức là deep_link_value (and other parameter names and values) - with the marketer
  3. Triển khai các onAppOpenAttribution() logic
  4. Triển khai các onAttributionFailure() logic

Quyết định hành vi của ứng dụng

Để quyết định hành vi của ứng dụng khi có người nhấp vào liên kết:

Nhận từ nhà tiếp thị: Hành vi mong đợi của liên kết khi có người nhấp vào liên kết đó.

Lập kế hoạch giá trị đầu vào của phương thức

When a OneLink is clicked and the user has the app installed on their device, the onAppOpenAttribution method is called by the AppsFlyer SDK. This is referred to as a retargeting re-engagement.

The onAppOpenAttribution nhận các biến làm giá trị đầu vào như sau: Map <String, String>.
Cấu trúc dữ liệu đầu vào được mô tả tại đây.

Triển khai logic onAppOpenAttribution()

The deep link opens the onAppOpenAttribution trong hoạt động chính. Các thông số OneLink trong đầu vào phương thức được sử dụng để triển khai trải nghiệm người dùng cụ thể khi ứng dụng được mở.

Mã ví dụ:

@Override
  public void onAppOpenAttribution(Map<String, String> attributionData) {
  if (!attributionData.containsKey("is_first_launch"))
    Log.d(LOG_TAG, "onAppOpenAttribution: This is NOT deferred deep linking");
  for (String attrName : attributionData.keySet()) {
    String deepLinkAttrStr = attrName + " = " + attributionData.get(attrName);
    Log.d(LOG_TAG, "Deeplink attribute: " + deepLinkAttrStr);
  }
  Log.d(LOG_TAG, "onAppOpenAttribution: Deep linking into " + attributionData.get("deep_link_value"));
  goToFruit(attributionData.get("deep_link_value"), attributionData);
}

@Override
  public void onAttributionFailure(String errorMessage) {
  Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
}

private void goToFruit(String fruitName, Map<String, String> dlData) {
    String fruitClassName = fruitName.concat("Activity");
    try {
        Class fruitClass = Class.forName(this.getPackageName().concat(".").concat(fruitClassName));
        Log.d(LOG_TAG, "Looking for class " + fruitClass);
        Intent intent = new Intent(getApplicationContext(), fruitClass);
        if (dlData != null) {
            // Map is casted HashMap since it is easier to pass serializable data to an intent
            HashMap<String, String> copy = new HashMap<String, String>(dlData);
            intent.putExtra(DL_ATTRS, copy);
        }
        startActivity(intent);
    } catch (ClassNotFoundException e) {
        Log.d(LOG_TAG, "Deep linking failed looking for " + fruitName);
        e.printStackTrace();
    }
}

⇲ Liên kết Github: Java

ℹ️

Lưu ý

onAppOpenAttribution không được gọi ra khi ứng dụng đang chạy ngầm và Ứng dụng LaunchMode 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 không phải là ứng dụng tiêu chuẩn LaunchMode.

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

Triển khai logic onAttributionFailure()

The onAttributionFailure method is called whenever the call to onAppOpenAttribution fails. The function should report the error and create an expected experience for the user.

@Override
public void onAttributionFailure(String errorMessage) {
    Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
}

⇲ Liên kết Github: Java

Liên kết sâu gián tiếp

Overview

Deferred deep linking, trước tiên, hướng người dùng mới đến đúng cửa hàng ứng dụng để cài đặt ứng dụng, sau đó, sau lần mở đầu tiên, đến trải nghiệm ứng dụng cụ thể (ví dụ: một trang cụ thể trong ứng dụng).

When the user first launches the app, the onConversionDataSuccess callback function receives both the conversion data of the new user, and OneLink data. The OneLink data makes in-app routing possible due to the deep_link_value hoặc ứng dụng khác được chuyển đến ứng dụng khi HĐH mở ứng dụng.

Only the deep_link_value is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data. The AppsFlyer OneLink ensures that the correct parameters are passed along with the user's click, thus personalizing the user’s app experience.

The marketer and developer must coordinate regarding desired app behavior and deep_link_value. The marketer uses the parameters to create deep links, and the developer customizes the behavior of the app based on the value received.

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.

Luồng liên kết sâu bị trì hoãn hoạt động như sau:
Deferred Deep Linking flow!

  1. Người dùng nhấp vào OneLink trên thiết bị chưa được cài đặt ứng dụng.
  2. AppsFlyer đăng ký lượt nhấp và chuyển hướng người dùng đến đúng cửa hàng ứng dụng hoặc trang đích.
  3. Người dùng cài đặt và khởi chạy ứng dụng.
  4. AppsFlyer SDK được khởi tạo và lượt cài đặt được phân bổ vào các máy chủ AppsFlyer.
  5. The SDK triggers the onConversionDataSuccess method. The function receives input that includes both the deep_link_value, and the attribution data/parameters defined in the OneLink data.
  6. Tham số is_first_launch has the value true, báo hiệu luồng deferred deep link.
    Nhà phát triển sử dụng dữ liệu nhận được trong hàm onConversionDataSuccess để tạo trải nghiệm được cá nhân hóa cho người dùng trong lần đầu khởi chạy ứng dụng.

Procedures

To implement the onConversionDataSuccess method and set up the parameter behaviors, the following action checklist of procedures need to be completed.

  1. Quyết định hoạt động của ứng dụng trong lần khởi chạy đầu tiên, và deep_link_value (and other parameter names and values) - with the marketer
  2. Lập kế hoạch giá trị đầu vào của phương thức, tức là deep_link_value (and other parameter names and values) - with the marketer
  3. Triển khai các onConversionDataSuccess() logic
  4. Triển khai các onConversionDataFail() logic

Quyết định hành vi của ứng dụng trong lần khởi chạy đầu tiên

Để quyết định hành vi của ứng dụng trong lần khởi chạy đầu tiên:

Nhận từ nhà tiếp thị: Hành vi mong đợi của liên kết khi có người nhấp vào và ứng dụng mở lần đầu.

Lập kế hoạch giá trị đầu vào của phương thức

For deferred deep linking, the onConversionDataSuccess method input must be planned and the input decided in the previous section (for deep linking) is made relevant for the first time the app is launched.

The onConversionDataSuccess method gets the deep_link_value và các biến khác làm giá trị đầu vào như: Map <String, Object>.

Bản đồ chứa hai loại dữ liệu:

  • Dữ liệu phân bổ
  • Data defined by the marketer in the link (deep_link_value and other parameters and values)
    Other parameters can be either:
    • Các thông số chính thức của AppsFlyer.
    • Các thông số và giá trị tùy chỉnh do nhà tiếp thị và nhà phát triển chọn.
    • Cấu trúc dữ liệu đầu vào được mô tả tại đây.

The marketer and developers need to plan the deep_link_value (and other possible parameters and values) together based on the desired app behavior when the link is clicked.

To plan the deep_link_value, and other parameter names and values based on the expected link behavior:

  1. Cho nhà tiếp thị biết những thông số và giá trị nào cần thiết cho việc triển khai hành vi mong muốn của ứng dụng.
  2. Decide on naming conventions for the deep_link_value and other parameters and values.
    Note:
    • Thông số tùy chỉnh sẽ không xuất hiện trong dữ liệu thô được thu thập trong AppsFlyer.
    • Dữ liệu chuyển đổi sẽ không trả về thông số tùy chỉnh có tên "name" với chữ "n" viết thường.

Triển khai logic onConversionDataSuccess()

When the app is opened for the first time, the onConversionDataSuccess method is triggered in the main activity. The deep_link_value and other parameters in the method input are used to implement the specific user experience when the app is first launched.

Để triển khai logic:

  1. Triển khai logic dựa trên các thông số và giá trị đã chọn. Xem ví dụ mã sau đây.
  2. Sau khi hoàn tất, hãy gửi xác nhận cho nhà tiếp thị rằng ứng dụng hoạt động theo đúng vậy.

Mã mẫu

@Override
 public void onConversionDataSuccess(Map<String, Object> conversionData) {
     for (String attrName : conversionData.keySet())
         Log.d(LOG_TAG, "Conversion attribute: " + attrName + " = " + conversionData.get(attrName));
     String status = Objects.requireNonNull(conversionData.get("af_status")).toString();
     if(status.equals("Non-organic")){
         if( Objects.requireNonNull(conversionData.get("is_first_launch")).toString().equals("true")){
             Log.d(LOG_TAG,"Conversion: First Launch");
             if (conversionData.containsKey("deep_link_value")){
                 Log.d(LOG_TAG,"Conversion: This is deferred deep linking.");
                 //  TODO SDK in future versions - match the input types
                 Map<String,String> newMap = new HashMap<>();
                 for (Map.Entry<String, Object> entry : conversionData.entrySet()) {
                         newMap.put(entry.getKey(), String.valueOf(entry.getValue()));
                 }
                 onAppOpenAttribution(newMap);
             }
         } else {
             Log.d(LOG_TAG,"Conversion: Not First Launch");
         }
     } else {
         Log.d(LOG_TAG,"Conversion: This is an organic install.");
     }
 }

⇲ Liên kết Github: Java

Triển khai logic onConversionDataFailure()

The onConversionDataFailure method is called whenever the call to onConversionDataSuccess fails. The function should report the error and create an expected experience for the user.

To implement the onConversionDataFailure :

@Override
public void onConversionDataFail(String errorMessage) {
    Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
}

⇲ Liên kết Github: Java

Tải trọng mẫu Android

Xem các tải trọng mẫu sau cho Liên kết Ứng dụng, lược đồ URI và deferred deep linking. Các mẫu chứa toàn bộ tải trọng, có liên quan khi tất cả các thông số trong trang thiết lập liên kết tùy chỉnh Onelink chứa dữ liệu.

Lưu ý: Tải trọng trả lại dưới dạng bản đồ. Tuy nhiên, để rõ ràng, các tải trọng mẫu theo sau được hiển thị ở dạng JSON.

Android App Links

Giá trị đầu vào cho onAppOpenAttribution(Map<String, String> attributionData)

{
    "af_dp": "afbasicapp://mainactivity",
    "af_ios_url": "https://isitchristmas.com/",
    "fruit_name": "apples",
    "c": "fruit_of_the_month",
    "media_source": "Email",
    "link": "https://onelink-basic-app.onelink.me/H5hv/6d66214a",
    "pid": "Email",
    "af_cost_currency": "USD",
    "af_sub1": "my_sub1",
    "af_click_lookback": "20d",
    "af_adset": "my_adset",
    "af_android_url": "https://isitchristmas.com/",
    "af_sub2": "my_sub2",
    "fruit_amount": 26,
    "af_cost_value": 6,
    "campaign": "fruit_of_the_month",
    "af_channel": "my_channel",
    "af_ad": "my_adname",
    "is_retargeting": "true"
}
{
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "fruit_name": "apples",
    "af_ios_url": "https://my_ios_lp.com",
    "media_source": "Email",
    "scheme": "https",
    "link": "https://onelink-basic-app.onelink.me/H5hv?pid=Email&c=fruit_of_the_month&af_channel=my_channel&af_adset=my_adset&af_ad=my_adname&af_sub1=my_sub1&af_sub2=my_sub2&fruit_name=apples&fruit_amount=16&af_cost_currency=USD&af_cost_value=6&af_click_lookback=20d&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_android_url=https%3A%2F%2Fmy_android_lp.com",
    "af_cost_currency": "USD",
    "af_sub1": "my_sub1",
    "af_click_lookback": "20d",
    "path": "/H5hv",
    "af_adset": "my_adset",
    "af_android_url": "https://my_android_lp.com",
    "af_sub2": "my_sub2",
    "fruit_amount": 16,
    "af_cost_value": 6,
    "host": "onelink-basic-app.onelink.me",
    "campaign": "fruit_of_the_month",
    "af_channel": "my_channel",
    "af_ad": "my_adname"
}

URI schemes

Giá trị đầu vào cho onAppOpenAttribution(Map<String, String> attributionData)

{
    "scheme": "afbasicapp",
    "link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_force_deeplink=true&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email&shortlink=9270d092",
    "af_cost_currency": "NZD",
    "af_click_lookback": "25d",
    "af_deeplink": true,
    "path": "",
    "af_android_url": "https://my_android_lp.com",
    "af_force_deeplink": true,
    "fruit_amount": 15,
    "host": "mainactivity",
    "af_channel": "my_channel",
    "shortlink": "9270d092",
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "af_ios_url": "https://my_ios_lp.com",
    "fruit_name": "apples",
    "af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
    "media_source": "Email",
    "af_status": "Non-organic",
    "af_sub1": "my_sub1",
    "af_adset": "my_adset",
    "af_sub2": "my_sub2",
    "af_cost_value": 5,
    "campaign": "my_campaign",
    "af_ad": "my_adname",
    "is_retargeting": true
}
{
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "af_ios_url": "https://my_ios_lp.com",
    "fruit_name": "apples",
    "af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
    "scheme": "afbasicapp",
    "media_source": "Email",
    "link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email",
    "af_cost_currency": "NZD",
    "af_status": "Non-organic",
    "af_click_lookback": "25d",
    "af_sub1": "my_sub1",
    "af_deeplink": true,
    "path": "",
    "af_android_url": "https://my_android_lp.com",
    "af_adset": "my_adset",
    "fruit_amount": 15,
    "af_sub2": "my_sub2",
    "host": "mainactivity",
    "af_cost_value": 5,
    "campaign": "my_campaign",
    "af_channel": "my_channel",
    "af_ad": "my_adname",
    "is_retargeting": true
}

Deferred deep linking

Giá trị đầu vào cho onConversionDataSuccess(Map<String, Object> conversionData)

{
    "redirect_response_data": null,
    "adgroup_id": null,
    "engmnt_source": null,
    "retargeting_conversion_type": "none",
    "orig_cost": 6.0,
    "af_cost_currency": "USD",
    "is_first_launch": true,
    "af_click_lookback": "20d",
    "af_cpi": null,
    "iscache": true,
    "click_time": "2020-08-12 16:04:50.605",
    "af_android_url": "https://isitchristmas.com/",
    "fruit_amount": 26,
    "is_branded_link": null,
    "match_type": "probabilistic",
    "adset": null,
    "af_channel": "my_channel",
    "campaign_id": null,
    "shortlink": "6d66214a",
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-12 16:05:33.750",
    "af_ios_url": "https://isitchristmas.com/",
    "fruit_name": "apples",
    "media_source": "Email",
    "agency": null,
    "af_siteid": null,
    "af_status": "Non-organic",
    "af_sub1": "my_sub1",
    "cost_cents_USD": 600,
    "af_sub5": null,
    "af_adset": "my_adset",
    "af_sub4": null,
    "af_sub3": null,
    "af_sub2": "my_sub2",
    "adset_id": null,
    "esp_name": null,
    "af_cost_value": 6,
    "campaign": "fruit_of_the_month",
    "http_referrer": "android-app://com.slack/",
    "af_ad": "my_adname",
    "is_universal_link": null,
    "is_retargeting": true,
    "adgroup": null
}