ユニファイド ディープリンク(UDL)
概要:Unified Deep Linking(UDL)により、アプリ起動時に新規および既存ユーザーを特定のアプリ内アクティビティ(例えば、アプリ内の特定のページなど)に誘導することができます。
UDLのプライバシー保護
新規ユーザーの場合、UDLメソッドはディファードディープリンクに関するパラメーターのみを返します:
deep_link_value
およびdeep_link_sub1-10
。その他のパラメーター(media_source
、campaign
、af_sub1-5
など)を取得しようとすると、null
を返します。
フロー


UDLはモバイルユーザーをアプリ内の特定のアクティビティまたはコンテンツに誘導します。
計測フローは次のとおりです。
- ユーザーがOneLinkのリンクをクリックします。
- ユーザーがアプリをインストールしている場合は、ユニバーサルリンクまたはURIスキームでアプリを開きます。
- ユーザーがアプリをインストールしていない場合は、アプリストアにリダイレクトされ、ダウンロード後、アプリを開きます。
- アプリ起動がAppsFlyer SDKをトリガーします。
- AppsFlyer SDKはUDL APIを実行します。
- UDL APIはOneLinkデータをAppsFlyerサーバーから取得します。
- UDL APIは、
DeepLinkDelegate
のdidResolveDeepLink()
をコールバックします。 didResolveDeepLink()
メソッドは、DeepLinkResult
オブジェクトを取得します。DeepLinkResult
オブジェクトには以下が含まれています。- ステータス (Found/Not found/Failure)
deep_link_value
とdeep_link_sub1-10
パラメーターを持つDeepLink
オブジェクト。これはOneLinkの主な目的である、ユーザーを特定のアプリ内アクティビティに誘導するためにディベロッパーが使用します。
前提条件
- UDL には、AppsFlyer iOS SDK V6.1以降が必要です。
計画
OneLinkを設定する際は、マーケティング担当者はこのパラメーターをリンクを作成するために使用し、ディベロッパーは、受け取った値をもとにアプリの動作をカスタマイズします。アプリ内でのルーティングやリンク先でのデータのパーソナライズなど、アプリ内でパラメータが正しく処理されるように実装するのはディベロッパーの責任です。
OneLinkの計画方法:
- ユーザーがURLをクリックしたときに、どのような動作が発生し、どのような体験をするのかをマーケティング担当者からヒアリングしてください。
- 希望する動作に基づいて、ユーザーにパーソナライズれた体験を提供するために必要な
deep_link_value
とその他のパラメーターを計画してください。deep_link_value
は、URL上でマーケティング担当者により設定され、ディベロッパーがユーザーをアプリ内の特定の場所にリダイレクトするために使用します。例えば、フルーツストアアプリ内でユーザーをリンゴのページにリダイレクトしたい場合、deep_link_value
の値はapples
となります。deep_link_sub1-10
パラメーターはURLに追加することができ、ユーザー体験をパーソナライズすることができます。例えば、10%割引をオファーする場合、deep_link_sub1
の値は、10
となります。
実装
🍏
iOS向けのUnified Deep Linking (UDL) API
Open Recipe
UDL APIを選択したパラメーターと値に基づいて実装してください。
self
を使用して、AppDelegate
をAppsFlyerLib.shared().deepLinkDelegate
に割り当てます。- アプリケーションの関数を実装して、以下を許可してください:
- ユニバーサルリンクが以下に対応:
continue
- URIが以下に対応:
handleOpen
- ユニバーサルリンクが以下に対応:
AppDelegate
のエクステンションとしてDeepLinkDelegate
作成してください。- ユニバーサルリンクとURIスキームをサポートするために、
application
関数を追加してください。 DeepLinkDelegate
にて、必ずコールバック関数didResolveDeepLink()
をオーバーライドしてください。didResolveDeepLink()
は、DeepLinkResult
オブジェクトを引数として受け取ります。DeepLinkResult.status
を使用して、ディープリンクのマッチが見つかるかどうかクエリしてください。- ステータスがエラーの場合は、
DeepLinkResult.error
を呼び出して、エラーフローを実行します。 - ステータスが見つかった場合には、
DeepLinkResult.deepLink
を使用して、DeepLink
オブジェクトを取得します。DeepLink
オブジェクトには、既知の OneLink キーから値を取得するために、パブリック変数に配置されたディープリンク情報が含まれています。例えば、deep_link_value
向けのDeepLink.deeplinkValue
です。 deepLinkObj.clickEvent["deep_link_sub1"]
を使ってdeep_link_sub1
を取得してください。deep_link_sub2-10
パラメーターについても同じ操作を行い、必要に応じて文字列値を変更してください。deep_link_value
とdeep_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
更新済 4か月前
このページは役に立ちましたか?