遅延ディープリンクを使用すると、アプリをインストールしていないユーザーがAdjustのリンクをクリックしてアプリストアからアプリをインストールし、アプリを初回起動した際に目的のコンテンツに誘導することができます。
仕組み
以下は、ディファードディープリンクの基本的なフローです。
- ユーザーがAdjustディープリンクをクリックします。
- AdjustサーバーがユーザーをApp Storeにリダイレクトします。
- ユーザーがアプリをインストールまたは再インストールして開きます。
- Adjust SDKが、Adjustのサーバーに
/attributionリクエストを送信します。
- Adjustのサーバーは、クリックをインストールまたは再インストールに一致させ、
/attributionレスポンスでディファードディープリンクを返します。Adjust SDKは、ディファードディープリンク リスナーを介してこれをアプリに提供します。
- 該当する場合、アプリにはオンボーディング画面やユーザーログインなどの初期画面が表示されます。
- アプリがディープリンクを処理し、適切な画面に誘導します。
ユーザーがAdjustのブランドリンク(brandname.go.link)をクリックし、そのリンクがディファードされた場合、Adjustのサーバーは、AdjustダッシュボードのAndroidプラットフォーム設定で設定されたアプリスキームを使用して、そのリンクをアプリスキーム形式(example://)に変換してから、Adjust SDKにパスします。
設定
ディファードディープリンクのリスナーを設定する
AdjustConfigオブジェクトを作成します。
AdjustConfigオブジェクトにディファードディープリンクのリスナーを設定します。Adjust SDKは、ディファードディープリンクを受け取った後にこのリスナーを呼び出します。
- SDKを初期化します。
val appToken = "{YourAppToken}"
val environment = AdjustConfig.ENVIRONMENT_SANDBOX
val config = AdjustConfig(this, appToken, environment)
config.setOnDeeplinkResponseListener { deeplink ->
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link
* (for example, store it or handle it immediately)
false // or true based on your use case (see below)
String appToken = "{YourAppToken}";
String environment = AdjustConfig.ENVIRONMENT_SANDBOX;
AdjustConfig config = new AdjustConfig(this, appToken, environment);
config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() {
public boolean launchReceivedDeeplink(Uri deeplink) {
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link
* (for example, store it or handle it immediately)
return false; // or true based on your use case (see below)
戻り値のオプション
ディファードディープリンク リスナーの戻り値によって、リスナーコードが実行された後に何が起こるかが決定します。
falseを返す(最も一般的)
アプリがいつ、どのようにディファードディープリンクを処理するかを完全に制御したい場合は、このアプローチを使用してください。falseを返すと、Adjust SDKはディファードディープリンクを開きません。例えば、アプリがディファードディープリンクを処理する前に初期画面(オンボーディングやログインなど)を表示してから移動する必要がある場合は、このアプローチが適切です。
戻り値 true
リスナーコードが実行された直後にAdjust SDKがディファードディープリンクを開くようにしたい場合は、このアプローチを使用してください。例えば、アプリに初期画面がない場合は、このアプローチが適切です。
Adjust SDKがディファードディープリンクを受け取ると、リスナーコードが実行され、Adjust SDKはstartActivity(Intent)をディファードディープリンクで呼び出します。
完全なコード例
この例では、オンボーディングプロセスを備えたアプリが、ディファードディープリンクをどのように処理するかを示します。
アプリの内部フローの概要は以下のとおりです。
-
ユーザーがアプリを起動すると、ディファードディープリンクが適用されます。
-
アプリがオンボーディングを開始します。
-
アプリのリスナーがAdjust SDKからディファードディープリンクを受け取り、オンボーディングが完了したかどうかを確認します。
- オンボーディングが完了すると、ディープリンクはすぐに処理されます。
- オンボーディングが完了していない場合は、ディープリンクが保存されます。
-
オンボーディングが終了すると、アプリは保存されたディファードディープリンクを確認し、処理します。
-
アプリがユーザーをディープリンク画面に誘導します。
class MainActivity : AppCompatActivity() {
private lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE)
val appToken = "{YourAppToken}"
val environment = if (BuildConfig.DEBUG) AdjustConfig.ENVIRONMENT_SANDBOX else AdjustConfig.ENVIRONMENT_PRODUCTION
val config = AdjustConfig(this, appToken, environment)
config.setLogLevel(if (BuildConfig.DEBUG) LogLevel.VERBOSE else LogLevel.SUPPRESS)
// Receive deferred deep link via listener
config.setOnDeeplinkResponseListener { deeplink: Uri? ->
return@setOnDeeplinkResponseListener false
val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)
if (hasCompletedOnboarding) {
// If onboarding is complete, handle deferred deep link immediately
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
.putString("deferred_link", deeplink.toString())
// The app controls when and how it handles the deferred deep link, so return false.
val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)
if (hasCompletedOnboarding) {
// Show onboarding screens and login prompt
// This logic runs when the user finishes the onboarding flow
fun onOnboardingFinished() {
// Set hasCompletedOnboarding to true
sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply()
// Check for deferred deep link received before or during onboarding
// Exit if no deferred deep link was stored
val deferredLinkString = sharedPreferences.getString("deferred_link", null) ?: return
// Remove the stored deep link to prevent it from being handled again
sharedPreferences.edit().remove("deferred_link").apply()
// Convert the stored string back to a Uri object
val deeplink = Uri.parse(deferredLinkString)
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
public class MainActivity extends AppCompatActivity {
private SharedPreferences sharedPreferences;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE);
String appToken = "{YourAppToken}";
String environment = BuildConfig.DEBUG ? AdjustConfig.ENVIRONMENT_SANDBOX : AdjustConfig.ENVIRONMENT_PRODUCTION;
AdjustConfig config = new AdjustConfig(this, appToken, environment);
config.setLogLevel(BuildConfig.DEBUG ? LogLevel.VERBOSE : LogLevel.SUPPRESS);
// Receive deferred deep link via listener
config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() {
public boolean launchReceivedDeeplink(Uri deeplink) {
boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);
if (hasCompletedOnboarding) {
// If onboarding is complete, handle deferred deep link immediately
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
.putString("deferred_link", deeplink.toString())
// The app controls when and how it handles the deferred deep link, so return false.
boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);
if (hasCompletedOnboarding) {
// Show onboarding screens and login prompt
// This logic runs when the user finishes the onboarding flow
private void onOnboardingFinished() {
// Set hasCompletedOnboarding to true
sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply();
// Check for deferred deep link received before or during onboarding
// Exit if no deferred deep link was stored
String deferredLinkString = sharedPreferences.getString("deferred_link", null);
if (deferredLinkString == null) {
// Remove the stored deep link to prevent it from being handled again
sharedPreferences.edit().remove("deferred_link").apply();
// Convert the stored string back to a Uri object
Uri deeplink = Uri.parse(deferredLinkString);
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.