ディープリンクのサポートを追加する
ディープリンク は、ユーザーをアプリ内の特定のコンテンツに誘導します。アプリがインストールされたデバイスでユーザーがディープリンクをタップすると、アプリは商品ページや特定の体験など、意図したコンテンツを直接開きます。
Singularトラッキングリンクは、標準のディープリンク(インストール済みアプリ用)とディファードディープリンク(新規インストール用)の両方をサポートします。詳細については、 ディープリンクFAQ および Singular Links FAQ を参照してください。
要件
前提条件
アプリのディープリンクを有効にするには、 Singular Linksの前提条件 を完了してください。
Singular Linksハンドラーの実装
SingularLinkHandlerは、アプリが開かれるときにSingularトラッキングリンクからディープリンク、ディファードディープリンク、およびパススルーのパラメータを取得するためのコールバックメカニズムを提供します。
利用可能なパラメータ:
- ディープリンク (_dl): リンクをクリックしたユーザー向けのアプリ内宛先URL
- ディファードディープリンク (_ddl): リンクをクリックした後にアプリをインストールするユーザー向けの宛先URL
- パススルー (_p): 追加のコンテキスト用にトラッキングリンクを介して渡されるカスタムデータ
SDKの設定
AndroidManifestの設定
SDKがディープリンクを解決する前に、アクティビティはインテントフィルターを宣言して、Androidが受信した
ACTION_VIEW
インテントをそのアクティビティにルーティングするようにする必要があります。
AndroidManifest.xml
のランチャーアクティビティ(またはディープリンクを受信するアクティビティ)にフィルターを追加し、独自のschemeとhostに置き換えてください。
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Custom URI scheme deep link -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="yourapp" />
</intent-filter>
<!-- HTTPS Singular Link (replace with your branded subdomain) -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="yourcompany.sng.link" />
<data android:pathPrefix="/A"/>
<data android:pathPrefix="/B"/>
<data android:pathPrefix="/E"/>
<data android:pathPrefix="/F"/>
</intent-filter>
</activity>
これらのインテントフィルターがない場合、OSはディープリンクのインテントをアクティビティに配信せず、
SingularLinkHandler
コールバックは実行されません。
android:autoVerify="true"
を伴うHTTPS schemeのApp Linksには、宛先ドメインにホストされた
/.well-known/assetlinks.json
ファイルも必要です。
ConfigにSingularLinkHandlerを追加
SDKの初期化中にSingularLinkHandlerを設定して、受信するディープリンクおよびディファードディープリンクのデータを処理します。
private fun initSingularSDK() {
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withSingularLink(intent) { params ->
val deeplink = params.deeplink
val passthrough = params.passthrough
val isDeferred = params.isDeferred
Log.d("SingularLink", "Deeplink: ${deeplink ?: "null"}")
Log.d("SingularLink", "Passthrough: ${passthrough ?: "null"}")
Log.d("SingularLink", "Is Deferred: $isDeferred")
// Handle deep link routing
deeplink?.let { url ->
handleDeepLink(url, isDeferred)
}
}
try {
Singular.init(applicationContext, config)
Log.d("Singular", "SDK initialized successfully")
} catch (e: Exception) {
Log.e("Singular", "SDK initialization failed: ${e.message}")
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Configure onNewIntent to handle Warm start deeplinks
intent?.let {
setIntent(intent)
initSingularSDK()
}
}
private void initSingularSDK() {
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withSingularLink(getIntent(), new SingularLinkHandler() {
@Override
public void onResolved(SingularLinkParams params) {
String deeplink = params.getDeeplink();
String passthrough = params.getPassthrough();
boolean isDeferred = params.isDeferred();
Log.d("SingularLink", "Deeplink: " + (deeplink != null ? deeplink : "null"));
Log.d("SingularLink", "Passthrough: " + (passthrough != null ? passthrough : "null"));
Log.d("SingularLink", "Is Deferred: " + isDeferred);
// Handle deep link routing
if (deeplink != null) {
handleDeepLink(deeplink, isDeferred);
}
}
});
try {
Singular.init(getApplicationContext(), config);
Log.d("Singular", "SDK initialized successfully");
} catch (Exception e) {
Log.e("Singular", "SDK initialization failed: " + e.getMessage());
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Configure onNewIntent to handle Warm start deeplinks
if (intent != null) {
setIntent(intent);
initSingularSDK();
}
}
注意: SingularLinkHandlerは、アプリがSingular Linkを通じて開かれた場合にのみトリガーされます。詳細については、 Singular Links FAQ を参照してください。
withSingularLink
は
shortlinkTimeoutSec
引数なしで呼び出された場合、短縮リンクの解決タイムアウトはデフォルトで10秒です。これをオーバーライドするには、3つの引数を持つオーバーロード
withSingularLink(Intent intent, SingularLinkHandler handler, long shortlinkTimeoutSec)
を使用してください。インテントアクションが
ACTION_VIEW
の場合、SDKはセッションをディープリンクで開かれたものとしてマークし、これはアトリビューションに影響します。
ハンドラーの動作
SingularLinkHandlerの実行を理解する
SingularLinkHandlerは、アプリが新規にインストールされたか、すでにインストールされているかによって動作が異なります。
新規インストール (ディファードディープリンク)
新規インストールでは、アプリの起動時にOpen URLが存在しません。Singularは、トラッキングリンクにディープリンクまたはディファードディープリンクの値が含まれていたかどうかを判定するためにアトリビューションを完了します。
ディファードディープリンクのフロー:
- ユーザーがディープリンク値で構成されたSingularトラッキングリンクをクリックします
- ユーザーがアプリをインストールして初めて開きます
- Singular SDKが最初のセッションをSingularサーバーに送信します
- アトリビューションが完了し、トラッキングリンクからのディープリンクが識別されます
-
ディープリンク値は、
isDeferred = trueと共にdeeplinkパラメータでSingularLinkHandlerに返されます
ディファードディープリンクのテスト:
- テストデバイスからアプリをアンインストールします(現在インストールされている場合)
- デバイスでGoogle Advertising ID (GAID)をリセットします
- デバイスからSingularトラッキングリンクをクリックします(ディープリンク値で構成されていることを確認してください)
- アプリをインストールして開きます
アトリビューションが正常に完了し、ディファードディープリンクの値がSingularLinkHandlerに渡されます。
Pro Tip:
異なるパッケージ名(例:
com.example.prod
の代わりに
com.example.dev
)を持つ開発ビルドでディープリンクをテストする場合は、開発アプリのパッケージ名専用にトラッキングリンクを構成してください。テストリンクをクリックした後、アプリストアからプロダクションアプリをダウンロードするのではなく、Android StudioまたはAPKを介して開発ビルドをデバイスに直接インストールしてください。
既にインストール済み (即時ディープリンク)
アプリがすでにインストールされている場合、Singular Linkをクリックすると、Android App Linksテクノロジーを使用してアプリが即座に開きます。
即時ディープリンクのフロー:
- ユーザーがSingularトラッキングリンクをクリックします
- Android OSがSingularトラッキングリンク全体を含むOpen URLを提供します
- SDKの初期化中に、SingularがAndroid Intentを解析します
-
Singularが
deeplinkおよびpassthroughの値を抽出します -
値は
isDeferred = falseと共にSingularLinkHandlerを通じて返されます
パススルーパラメータ
パススルーパラメータを使用して、トラッキングリンクのクリックから追加データを取得します。
トラッキングリンクに
passthrough (_p)
パラメータが含まれている場合、SingularLinkHandlerの
passthrough
パラメータには対応するデータが含まれます。これを使用して、キャンペーンのメタデータ、ユーザーセグメンテーションデータ、またはアプリで必要な任意のカスタム情報を取得できます。
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withSingularLink(intent) { params ->
// Extract passthrough data
params.passthrough?.let { passthroughData ->
try {
// Parse and use custom data
val jsonData = JSONObject(passthroughData)
val campaignId = jsonData.optString("campaign_id")
val userSegment = jsonData.optString("segment")
Log.d("SingularLink", "Campaign ID: $campaignId")
Log.d("SingularLink", "User Segment: $userSegment")
} catch (e: JSONException) {
Log.e("SingularLink", "Error parsing passthrough data", e)
}
}
}
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withSingularLink(getIntent(), new SingularLinkHandler() {
@Override
public void onResolved(SingularLinkParams params) {
// Extract passthrough data
String passthroughData = params.getPassthrough();
if (passthroughData != null) {
try {
// Parse and use custom data
JSONObject jsonData = new JSONObject(passthroughData);
String campaignId = jsonData.optString("campaign_id");
String userSegment = jsonData.optString("segment");
Log.d("SingularLink", "Campaign ID: " + campaignId);
Log.d("SingularLink", "User Segment: " + userSegment);
} catch (JSONException e) {
Log.e("SingularLink", "Error parsing passthrough data");
}
}
}
});
すべてのクエリパラメータを転送
トラッキングリンクURLからすべてのクエリパラメータを取得するには、
_forward_params=2
パラメータを追加します。
_forward_params=2
がトラッキングリンクに追加されると、すべてのクエリパラメータがSingularLinkHandlerの
deeplink
パラメータに含まれ、すべてのパラメータを含む完全なURLにアクセスできるようになります。
トラッキングリンクの例:
https://yourapp.sng.link/A1b2c/abc123?_dl=myapp://product/123&_forward_params=2&utm_source=facebook&promo=SALE2024
SingularLinkHandlerは以下を受信します:
deeplink = "myapp://product/123?utm_source=facebook&promo=SALE2024"