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 and deep_link_sub1-10. If you try to get any other parameters (media_source, campaign, af_sub1-5など)、null を返します。

ステップバイステップ例

フロー

Android UDL flow!

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

  1. ユーザーがOneLinkのリンクをクリックします。
    • ユーザーがアプリをインストールしている場合は、AndroidアプリリンクまたはURIスキームでアプリを開きます。
    • ユーザーがアプリをインストールしていない場合は、アプリストアにリダイレクトされ、ダウンロード後、アプリを開きます。
  2. アプリ起動がAppsFlyer SDKをトリガーします。
  3. AppsFlyer SDKはUDL APIを実行します。
  4. UDL APIはOneLinkデータをAppsFlyerサーバーから取得します。
  5. The UDL API calls back the onDeepLinking() メソッド DeepLinkingListener class.
  6. The onDeepLinking() method gets a DeepLinkResult object.
  7. The DeepLinkResult object includes:
    • Status (Found/Not found/Error)
    • A DeepLink object that carries the deep_link_value and deep_link_sub1-10 OneLinkの主な目的である特定のアプリ内アクティビティにユーザーをルーティングするために開発者が使用するパラメーター。

前提条件

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

計画

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

OneLinkの計画方法:

  1. ユーザーが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.

実装

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

  1. 次を使用してください: subscribeForDeepLink() メソッド(から AppsFlyerLib)登録し DeepLinkListener インターフェイスリスナー
  2. コールバック関数をオーバーライドしてください onDeepLinking().
    onDeepLinking() 引数 a として受け入れます DeepLinkResult object.
  3. Use getStatus() to query whether the deep linking match is found.
  4. For when the status is an error, call getError() and run your error flow.
  5. For when the status is found, use getDeepLink() to retrieve the DeepLink object.
    The DeepLink オブジェクトには、ディープリンク情報とヘルパー関数が含まれており、よく知られているOneLinkキーから値を簡単に取得できます。 getDeepLinkValue().
  6. Use getDeepLinkValue() to retrieve the deep_link_value.
  7. Use getStringValue("deep_link_sub1") to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  8. 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.

📘

注意

onDeepLinking は、アプリがバックグラウンドで動作していて、Application LaunchModeが標準でない場合には呼び出されません。これを修正するには、 setIntent(intent) method to set the intent value inside the overridden method onNewIntent アプリケーションが非標準の起動モードを使用している場合。

       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

ディファードディプリンクのテスト

Before you begin

  • 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 ID H5hv

The test link

既存のOneLinkリンクを使用することも、テスト用にマーケティング担当者に新しいリンクを作成してもらうこともできます。OneLinkのURLは、ショートリンクとロングリンクのどちらでも使用できます。

既存のリンクに一時的にパラメータを追加する

  • リンクのドメインとOneLinkテンプレートのみを使用してください。
    例: {0} https://onelink-basic-app.onelink.me/H5hv.
  • Add OneLink parameters deep_link_value and deep_link_sub1-10、アプリケーションで期待どおりです。パラメータは、クエリパラメータとして追加する必要があります。

    • 例: https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23

Perform the test

  1. 端末でリンクをクリックします。
  2. OneLinkの設定内容に基づき Google PlayまたはWebサイトにリダイレクトされます。
  3. アプリをインストールします。

    重要

    • アプリがまだ開発中で、ストアにアップロードされていない場合、このような画像が表示されます:
      drawing
    • - *アンドロイドスタジオ*またはあなたが使用する他のIDEからアプリケーションをインストールします。
  4. 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)

Before you begin

Create the test link

ディファードディープリンクと同じ方法を使用します。

Perform the test

  1. 端末でリンクをクリックします。
  2. 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署名が正しいかどうか確認してください。

  1. Use adb デバイスでアプリの署名を取得します:
adb shell pm get-app-links <PACKAGE_NAME>

-2. Make sure the subdomain is verified.
adb verified!

  1. If the subdomain isn't verified, it shows 1024.
    adb verified!