ユニファイド ディープリンク(UDL)

概要:Unified Deep Linking(UDL)により、アプリ起動時に新規および既存ユーザーを特定のアプリ内アクティビティ(例えば、アプリ内の特定のページなど)に誘導することができます。

📘

UDLのプライバシー保護

新規ユーザーの場合、UDLメソッドはディファードディープリンクに関するパラメーターのみを返します:deep_link_value および deep_link_sub1-10。その他のパラメーター(media_sourcecampaignaf_sub1-5 など)を取得しようとすると、null を返します。

フロー

UDLはモバイルユーザーをアプリ内の特定のアクティビティまたはコンテンツに誘導します。

計測フローは次のとおりです。

  1. ユーザーがOneLinkのリンクをクリックします。
    • ユーザーがアプリをインストールしている場合は、ユニバーサルリンクまたはURIスキームでアプリを開きます。
    • ユーザーがアプリをインストールしていない場合は、アプリストアにリダイレクトされ、ダウンロード後、アプリを開きます。
  2. アプリ起動がAppsFlyer SDKをトリガーします。
  3. AppsFlyer SDKはUDL APIを実行します。
  4. UDL APIはOneLinkデータをAppsFlyerサーバーから取得します。
  5. UDL APIは、DeepLinkDelegatedidResolveDeepLink() をコールバックします。
  6. didResolveDeepLink() メソッドは、DeepLinkResult オブジェクトを取得します。
  7. DeepLinkResult オブジェクトには以下が含まれています。
    • ステータス (Found/Not found/Failure)
    • deep_link_valuedeep_link_sub1-10 パラメーターを持つ DeepLinkオブジェクト。これはOneLinkの主な目的である、ユーザーを特定のアプリ内アクティビティに誘導するためにディベロッパーが使用します。

前提条件

  • UDL には、AppsFlyer iOS SDK V6.1以降が必要です。

計画

OneLinkを設定する際は、マーケティング担当者はこのパラメーターをリンクを作成するために使用し、ディベロッパーは、受け取った値をもとにアプリの動作をカスタマイズします。アプリ内でのルーティングやリンク先でのデータのパーソナライズなど、アプリ内でパラメータが正しく処理されるように実装するのはディベロッパーの責任です。

OneLinkの計画方法:

  1. ユーザーがURLをクリックしたときに、どのような動作が発生し、どのような体験をするのかをマーケティング担当者からヒアリングしてください。
  2. 希望する動作に基づいて、ユーザーにパーソナライズれた体験を提供するために必要な deep_link_value とその他のパラメーターを計画してください。
    • deep_link_value は、URL上でマーケティング担当者により設定され、ディベロッパーがユーザーをアプリ内の特定の場所にリダイレクトするために使用します。例えば、フルーツストアアプリ内でユーザーをリンゴのページにリダイレクトしたい場合、deep_link_value の値は apples となります。
    • deep_link_sub1-10 パラメーターはURLに追加することができ、ユーザー体験をパーソナライズすることができます。例えば、10%割引をオファーする場合、deep_link_sub1の値は、10となります。

実装

UDL APIを選択したパラメーターと値に基づいて実装してください。

  1. self を使用して、AppDelegateAppsFlyerLib.shared().deepLinkDelegateに割り当てます。
  2. アプリケーションの関数を実装して、以下を許可してください:
    • ユニバーサルリンクが以下に対応: continue
    • URIが以下に対応: handleOpen
  3. AppDelegate のエクステンションとして DeepLinkDelegate作成してください。
  4. ユニバーサルリンクとURIスキームをサポートするために、application 関数を追加してください。
  5. DeepLinkDelegate にて、必ずコールバック関数 didResolveDeepLink() をオーバーライドしてください。
    didResolveDeepLink() は、DeepLinkResultオブジェクトを引数として受け取ります。
  6. DeepLinkResult.status を使用して、ディープリンクのマッチが見つかるかどうかクエリしてください。
  7. ステータスがエラーの場合は、DeepLinkResult.error を呼び出して、エラーフローを実行します。
  8. ステータスが見つかった場合には、DeepLinkResult.deepLink を使用して、DeepLink オブジェクトを取得します。
    DeepLink オブジェクトには、既知の OneLink キーから値を取得するために、パブリック変数に配置されたディープリンク情報が含まれています。例えば、deep_link_value 向けの DeepLink.deeplinkValue です。
  9. deepLinkObj.clickEvent["deep_link_sub1"] を使って deep_link_sub1 を取得してください。deep_link_sub2-10 パラメーターについても同じ操作を行い、必要に応じて文字列値を変更してください。
  10. deep_link_valuedeep_link_sub1-10 が取得できたら、アプリ内ルーターへ渡しユーザー体験をパーソナライズするために使用してください。

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

⇲ Github リンク:Swift


このページは役に立ちましたか?