Liên kết Sâu Hợp nhất iOS

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

iOS 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 Chung 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 didResolveDeepLink() in the DeepLinkDelegate.
  6. The didResolveDeepLink() 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 parameters that the developer uses to route the user to a specific in-app activity, which is the main goal of OneLink.

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

  • UDL yêu cầu AppsFlyer iOS 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. Assign the AppDelegate using self to AppsFlyerLib.shared().deepLinkDelegate.
  2. Triển khai chức năng ứng dụng để cho phép:
    • Hỗ trợ Liên kết Chung với continue.
    • Hỗ trợ lược đồ URI với handleOpen.
  3. Create DeepLinkDelegate as an extension of AppDelegate.
  4. Add application functions to support Universal Links and URI schemes.
  5. In DeepLinkDelegate, make sure you override the callback function, didResolveDeepLink().
    didResolveDeepLink() accepts a DeepLinkResult object as an argument.
  6. Use DeepLinkResult.status to query whether the deep linking match is found.
  7. For when the status is an error, call DeepLinkResult.error and run your error flow.
  8. For when the status is found, use DeepLinkResult.deepLink to retrieve the DeepLink object.
    The DeepLink object contains the deep linking information arranged in public variables to retrieve the values from well-known OneLink keys, for example, DeepLink.deeplinkValue for deep_link_value.
  9. Use deepLinkObj.clickEvent["deep_link_sub1"] to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  10. 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.

Supporting legacy OneLink links

Liên kết OneLink cũ là các liên kết không chứa các thông số được đề xuất cho Liên kết Sâu Hợp nhất: deep_link_value and deep_link_sub1-10.
Thông thường, đây là những liên kết đã tồn tại trong trường 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ũ đượ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ó. Bạn nên thêm hỗ trợ trong lệnh gọi lại UDL didResolveDeepLink cho các thông số cũ.
Ví dụ mã Swift

Code example

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  ...
  AppsFlyerLib.shared().deepLinkDelegate = self
  ...
}

// For Swift version < 4.2 replace function signature with the commented out code
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { // this line for Swift < 4.2
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
  AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
  return true
}

// Open URI-scheme for iOS 9 and above
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  AppsFlyerLib.shared().handleOpen(url, options: options)
  return true
}

extension AppDelegate: DeepLinkDelegate {
    func didResolveDeepLink(_ result: DeepLinkResult) {
        var fruitNameStr: String?
        switch result.status {
        case .notFound:
            NSLog("[AFSDK] Deep link not found")
            return
        case .failure:
            print("Error %@", result.error!)
            return
        case .found:
            NSLog("[AFSDK] Deep link found")
        }
        
        guard let deepLinkObj:DeepLink = result.deepLink else {
            NSLog("[AFSDK] Could not extract deep link object")
            return
        }
        
        if deepLinkObj.clickEvent.keys.contains("deep_link_sub2") {
            let ReferrerId:String = deepLinkObj.clickEvent["deep_link_sub2"] as! String
            NSLog("[AFSDK] AppsFlyer: Referrer ID: \(ReferrerId)")
        } else {
            NSLog("[AFSDK] Could not extract referrerId")
        }        
        
        let deepLinkStr:String = deepLinkObj.toString()
        NSLog("[AFSDK] DeepLink data is: \(deepLinkStr)")
            
        if( deepLinkObj.isDeferred == true) {
            NSLog("[AFSDK] This is a deferred deep link")
        }
        else {
            NSLog("[AFSDK] This is a direct deep link")
        }
        
        fruitNameStr = deepLinkObj.deeplinkValue
        walkToSceneWithParams(fruitName: fruitNameStr!, deepLinkData: deepLinkObj.clickEvent)
    }
}
// User logic
fileprivate func walkToSceneWithParams(deepLinkObj: DeepLink) {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true, completion: nil)
    guard let fruitNameStr = deepLinkObj.clickEvent["deep_link_value"] as? String else {
         print("Could not extract query params from link")
         return
    }
    let destVC = fruitNameStr + "_vc"
    if let newVC = storyBoard.instantiateVC(withIdentifier: destVC) {
       print("AppsFlyer routing to section: \(destVC)")
       newVC.deepLinkData = deepLinkObj
       UIApplication.shared.windows.first?.rootViewController?.present(newVC, animated: true, completion: nil)
    } else {
        print("AppsFlyer: could not find section: \(destVC)")
    }
}

⇲ Liên kết Github: Swift

Deferred Deep Linking after network consent

In some cases the application might require consent from the user in order to connect to the network, in a dialog similar to this one:

In order to support deferred deep linking once the network consent is given we recommend:

  • Implement eDDL to allow UDL to handle the deferred deep linking

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 của bạn.
  • 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, đến App Store hoặc 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ừ Xcode.
  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 didResolveDeepLink .

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:
    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build
    
  • 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:
    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=efcecc2bc95a0862ceaa7b62fa8e98ae1e3e022XXXXXXXXXXXXXXXX
    
  • UDL đã nhận được phản hồi và gọi lệnh gọi lại didResolveDeepLink với status=FOUND và dữ liệu liên kết 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":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","deep_link_sub1":"23","af_sub2":""},"af_sub3":"","deep_link_value":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
    

Thử nghiệm liên kết sâu (Liên kết Chung)

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 Chung và truy xuất các thông số OneLink để gọi lại didResolveDeepLink .

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):
    [AppsFlyerSDK] [com.apple.main-thread] NSUserActivity `webpageURL`: https://onelink-basic-app.onelink.me/H5hv/apples
    [AppsFlyerSDK] [com.appsflyer.serial] UniversalLink/Deeplink found:
    https://onelink-basic-app.onelink.me/H5hv/apples
    [AppsFlyerSDK] [com.appsflyer.serial] Shortlink found. Executing: https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples
    ...
    [AppsFlyerSDK] [com.appsflyer.serial]                        
    [Shortlink] OneLink:{
      c = test1;
      campaign = test1;
      "deep_link_sub1" = 23;
      "deep_link_value" = peaches;
      "is_retargeting" = true;
      "media_source" = SMS;
      pid = SMS;
    } 
    
  • UDL gọi ra lệnh gọi lại didResolveDeepLink với status=FOUND và dữ liệu liên kết OneLink:
    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":null,"click_http_referrer":null,"af_sub1":null,"click_event":{"campaign":"test1","deep_link_sub1":"23","deep_link_value":"peaches","media_source":"SMS"},"af_sub3":null,"deep_link_value":"peaches","campaign":"test1","match_type":null,"af_sub5":null,"media_source":"SMS","campaign_id":null,"af_sub2":null}