Android Unified Deep Linking
概要:Unified Deep Linking(UDL)により、アプリ起動時に新規および既存ユーザーを特定のアプリ内アクティビティ(例えば、アプリ内の特定のページなど)に誘導することができます。
UDLのプライバシー保護
For new users, the UDL method only returns parameters relevant to deferred deep linking:
deep_link_value
anddeep_link_sub1-10
. If you try to get any other parameters (media_source
,campaign
,af_sub1-5
など)、null を返します。
フロー
計測フローは次のとおりです。
- ユーザーがOneLinkのリンクをクリックします。
- ユーザーがアプリをインストールしている場合は、AndroidアプリリンクまたはURIスキームでアプリを開きます。
- ユーザーがアプリをインストールしていない場合は、アプリストアにリダイレクトされ、ダウンロード後、アプリを開きます。
- アプリ起動がAppsFlyer SDKをトリガーします。
- AppsFlyer SDKはUDL APIを実行します。
- UDL APIはOneLinkデータをAppsFlyerサーバーから取得します。
- The UDL API calls back the
onDeepLinking()
メソッドDeepLinkingListener
class. - The
onDeepLinking()
method gets aDeepLinkResult
object. - The
DeepLinkResult
object includes:- Status (Found/Not found/Error)
- A
DeepLink
object that carries thedeep_link_value
anddeep_link_sub1-10
OneLinkの主な目的である特定のアプリ内アクティビティにユーザーをルーティングするために開発者が使用するパラメーター。
計画
- UDL には、AppsFlyer Android SDK V6.1以降が必要です。
OneLinkを設定する際は、マーケティング担当者はこのパラメーターをリンクを作成するために使用し、ディベロッパーは、受け取った値をもとにアプリの動作をカスタマイズします。アプリ内でのルーティングやリンク先でのデータのパーソナライズなど、アプリ内でパラメータが正しく処理されるように実装するのはディベロッパーの責任です。
OneLinkの計画方法:
- ユーザーがURLをクリックしたときに、どのような動作が発生し、どのような体験をするのかをマーケティング担当者からヒアリングしてください。
- 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 ofdeep_link_value
can beapples
. - 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 ofdeep_link_sub1
can be10
.
- The
実装
Let's save you some time >>
Set Deep Linking with our SDK integration wizard
UDL APIを選択したパラメーターと値に基づいて実装してください。
- 次を使用してください:
subscribeForDeepLink()
メソッド(からAppsFlyerLib
), before calling start, to register theDeepLinkListener
インターフェイスリスナー - コールバック関数をオーバーライドしてください
onDeepLinking()
.
onDeepLinking()
引数 a として受け入れますDeepLinkResult
object. - Use
getStatus()
to query whether the deep linking match is found. - For when the status is an error, call
getError()
and run your error flow. - For when the status is found, use
getDeepLink()
to retrieve theDeepLink
object.
TheDeepLink
オブジェクトには、ディープリンク情報とヘルパー関数が含まれており、よく知られているOneLinkキーから値を簡単に取得できます。getDeepLinkValue()
. - Use
getDeepLinkValue()
to retrieve thedeep_link_value
. - Use
getStringValue("deep_link_sub1")
to retrievedeep_link_sub1
. Do the same fordeep_link_sub2-10
parameters, changing the string value as required. - Once
deep_link_value
anddeep_link_sub1-10
are retrieved, pass them to an in-app router and use them to personalize the user experience.
注意
onDeepLinking
は、アプリがバックグラウンドで動作していて、Application LaunchModeが標準でない場合には呼び出されません。これを修正するには、setIntent(intent)
method to set the intent value inside the overridden methodonNewIntent
アプリケーションが非標準の起動モードを使用している場合。import android.content.Intent; ... ... ... @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); }
Supporting legacy OneLink links
従来の OneLink は、UDL に推奨されるパラメーターを含まないリンクです。 deep_link_value
and deep_link_sub1-10
.
通常、これらはすでに存在し、従来のメソッドから UDL に移行するときに使用されているリンクです。
レガシーリンクを使用する新しいユーザーは、 onConversionDataSuccess
拡張ディファードディープリンクのコンテキストで
UDL は、既存のユーザーのディープリンクを処理します。この場合、UDL コールバックにサポートを追加することをお勧めします。 onDeepLinking
レガシーパラメータ用。
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;
}
}
})
⇲ Github リンク:Java
ディファードディプリンクのテスト
Prerequisites
- UDL実装を完了してください。
- テストデバイスを登録してください。
- アプリでデバッグモードを有効にしてください。
- 端末にアプリがインストールされていないことを確認してください。
- マーケティング担当者もしくはAppsFlyer管理画面からOneLinkテンプレートを取得してください。
- リンクはこのようになります:
https://onelink-basic-app.onelink.me/H5hv
. - This example uses the OneLink subdomain
onelink-basic-app.onelink.me
and the OneLink template IDH5hv
- リンクはこのようになります:
The test link
既存のOneLinkリンクを使用することも、テスト用にマーケティング担当者に新しいリンクを作成してもらうこともできます。OneLinkのURLは、ショートリンクとロングリンクのどちらでも使用できます。
既存のリンクに一時的にパラメータを追加する
- リンクのドメインとOneLinkテンプレートのみを使用してください。
例: {0}https://onelink-basic-app.onelink.me/H5hv
. - Add OneLink parameters
deep_link_value
anddeep_link_sub1-10
、アプリケーションで期待どおりです。パラメータは、クエリパラメータとして追加する必要があります。
例:https://onelink-basic-app.onelink.me/H5hv?pid=my_media_source&deep_link_value=apples&deep_link_sub1=23
Perform the test
- 端末でリンクをクリックします。
- OneLinkの設定内容に基づき Google PlayまたはWebサイトにリダイレクトされます。
- アプリをインストールします。
重要
- アプリがまだ開発中で、ストアにアップロードされていない場合、このような画像が表示されます:
- - *アンドロイドスタジオ*またはあなたが使用する他のIDEからアプリケーションをインストールします。
- アプリがまだ開発中で、ストアにアップロードされていない場合、このような画像が表示されます:
- UDL detects the deferred deep linking, matches the install to the click and retrieves the OneLink parameters to
onDeepLinking
callback.
Expected logs results
📘 次のログは、デバッグモードが有効になっている場合にのみ使用できます。
-
SDKが初期化された場合:
D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
-
次のログは直接ディープリンクを参照しており、ディファードディープリンクシナリオでは無視できます:
D/AppsFlyer_6.9.0: No deep link detected
-
UDL APIの開始:
D/AppsFlyer_6.9.0: [DDL] start
-
UDLがAppsFlyerにクエリを送信し、このインストールとの一致を問い合わせる:
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 は応答を受け取り、呼び出します
onDeepLinking
コールバックstatus=FOUND
および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"}
ディープリンクのテスト(Android App Links)
Prerequisites
- UDL実装を完了してください。
- テストデバイスを登録してください。
- アプリでデバッグモードを有効にしてください。
- アプリがすでにデバイスにインストールされていることを確認してください
- マーケティング担当者もしくはAppsFlyer管理画面からOneLinkテンプレートを取得してください。
- リンクはこのようになります:
https://onelink-basic-app.onelink.me/H5hv
. - This example uses the OneLink subdomain
onelink-basic-app.onelink.me
and the OneLink template IDH5hv
.
- リンクはこのようになります:
- Android App Linkを設定します。
Create the test link
ディファードディープリンクと同じ方法を使用します。
Perform the test
- 端末でリンクをクリックします。
- UDL は Android App Linkを検出し、OneLink パラメーターを取得して
onDeepLinking
callback.
Expected logs results
📘 次のログは、デバッグモードが有効になっている場合にのみ使用できます。
- リンクがOneLinkショートリンクの場合(例: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 呼び出し
onDeepLinking
コールバックstatus=FOUND
および 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"}
ヒント
> Android App Linkをクリックした際に、OSがDisambiguationダイアログを表示したり、Google Playやウェブサイトにリダイレクトされる場合、SHA256署名が正しいかどうか確認してください。
- Use
adb
デバイスでアプリの署名を取得します:adb shell pm get-app-links <PACKAGE_NAME>
-2. Make sure the subdomain is
verified
.
- If the subdomain isn't verified, it shows
1024
.
更新済 18日前