延迟深度链接让未安装您应用的用户可以点击 Adjust 链接,从应用商店安装应用,并在首次打开应用时直接跳转至其目标内容。
工作原理
以下是延迟深度链接的基本流程:
- 用户点击 Adjust 深度链接。
- Adjust 服务器将用户重定向至应用商店。
- 用户安装或重装并打开应用。
- Adjust SDK 向 Adjust 服务器发送
/attribution请求。 - Adjust 服务器将匹配点击与安装/重装,并在
/attribution响应中将延迟深度链接返回至 SDK:Adjust SDK 会通过延迟深度链接监听器向您的应用发送该信息。 - 如果适用,您的应用将显示其初始界面,例如新客户引导界面和用户登录界面。
- 您的应用处理深度链接,并导航至相应界面。
延迟深度链接格式
当用户点击 Adjust 品牌化链接 (brandname.go.link),且该链接被延迟时,Adjust 的服务器会使用在 Adjust 控制面板的 Android 平台设置中配置的应用 Scheme,将其转换为应用 Scheme 格式 (example://),然后传递给 Adjust SDK。
设置
设置延迟深度链接监听器
- 创建一个
AdjustConfig对象。 - 在
AdjustConfig对象上设置延迟深度链接监听器。Adjust SDK 收到延迟深度链接后会调用该监听器。 - 初始化 SDK。
1val appToken = "{YourAppToken}"2val environment = AdjustConfig.ENVIRONMENT_SANDBOX3val config = AdjustConfig(this, appToken, environment)4
5config.setOnDeeplinkResponseListener { deeplink ->6 /*7 * deep link format:8 *9 * example://summer-clothes?promo=beach&adj_t=def45610 *11 * TODO: Handle the deep link12 * (for example, store it or handle it immediately)13 */14
15 false // or true based on your use case (see below)16}17
18Adjust.onCreate(config)1String appToken = "{YourAppToken}";2String environment = AdjustConfig.ENVIRONMENT_SANDBOX;3AdjustConfig config = new AdjustConfig(this, appToken, environment);4
5config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() {6 @Override7 public boolean launchReceivedDeeplink(Uri deeplink) {8 /*9 * deep link format:10 *11 * example://summer-clothes?promo=beach&adj_t=def45612 *13 * TODO: Handle the deep link14 * (for example, store it or handle it immediately)15 */16
17 return false; // or true based on your use case (see below)18 }19});20
21Adjust.onCreate(config);返回值选项
延迟深度链接监听器返回的值决定了监听器代码执行后会发生什么:
返回 false (最常见)
如果希望您的应用对延迟深链接的处理时间和方式拥有完全控制权,请采用此方法。返回 false 时,Adjust SDK 不会尝试打开延迟深度链接。例如,如果您的应用需要在处理延迟深度链接之前显示并跳过初始界面 (如新客户引导或登录界面),则此方法十分适用。
返回 true
如果您希望 Adjust SDK 在监听器代码运行完毕后立即尝试打开延迟深度链接,请使用此方法。例如,如果您的应用没有任何初始界面,则此方法十分适用。
Adjust SDK 收到延迟深度链接后,您的监听器代码就会运行。随后, Adjust SDK 会使用延迟深度链接调用 startActivity(Intent) 。
完整代码示例
此示例展示了拥有新客户引导流程的应用如何处理延迟深度链接。 应用内部流程总结如下:
-
用户打开应用,延迟深度链接进入可用状态。
-
应用开始其新客户引导流程。
-
应用的监听器从 Adjust SDK 接收延迟深度链接,然后检查新客户引导是否完成:
- 如果已完成新客户引导,会立即处理深度链接。
- 如果未完成新客户引导,则会存储深度链接。
-
新客户引导完成后,应用会检查并处理所有已存储的延迟深度链接。
-
应用将用户引导至深度链接界面。
1class MainActivity : AppCompatActivity() {2
3 private lateinit var sharedPreferences: SharedPreferences4
5 override fun onCreate(savedInstanceState: Bundle?) {6 super.onCreate(savedInstanceState)7
8 sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE)9
10 // Configure Adjust SDK11 val appToken = "{YourAppToken}"12 val environment = if (BuildConfig.DEBUG) AdjustConfig.ENVIRONMENT_SANDBOX else AdjustConfig.ENVIRONMENT_PRODUCTION13 val config = AdjustConfig(this, appToken, environment)14
15 config.setLogLevel(if (BuildConfig.DEBUG) LogLevel.VERBOSE else LogLevel.SUPPRESS)16
17 // Receive deferred deep link via listener18 config.setOnDeeplinkResponseListener { deeplink: Uri? ->19 if (deeplink == null) {20 return@setOnDeeplinkResponseListener false21 }22
23 val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)24
25 if (hasCompletedOnboarding) {26 // If onboarding is complete, handle deferred deep link immediately27
28 /*29 * deep link format:30 *31 * example://summer-clothes?promo=beach&adj_t=def45632 *33 * TODO: Handle the deep link and navigate to the appropriate screen.34 */35 } else {36 // Store deferred deep link to invoke after onboarding screens and login37 sharedPreferences.edit()38 .putString("deferred_link", deeplink.toString())39 .apply()40 }41
42 // The app controls when and how it handles the deferred deep link, so return false.43 false44 }45
46 // Initialize SDK47 Adjust.onCreate(config)48
49 val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)50
51 if (hasCompletedOnboarding) {52 // Show main content53 } else {54 // Show onboarding screens and login prompt55 }56 }57
58 // This logic runs when the user finishes the onboarding flow59 fun onOnboardingFinished() {60 // Set hasCompletedOnboarding to true61 sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply()62
63 // Check for deferred deep link received before or during onboarding64 // Exit if no deferred deep link was stored65 val deferredLinkString = sharedPreferences.getString("deferred_link", null) ?: return66
67 // Remove the stored deep link to prevent it from being handled again68 sharedPreferences.edit().remove("deferred_link").apply()69
70 // Convert the stored string back to a Uri object71 val deeplink = Uri.parse(deferredLinkString)72
73 /*74 * deep link format:75 *76 * example://summer-clothes?promo=beach&adj_t=def45677 *78 * TODO: Handle the deep link and navigate to the appropriate screen.79 */80 }81}1public class MainActivity extends AppCompatActivity {2
3 private SharedPreferences sharedPreferences;4
5 @Override6 protected void onCreate(Bundle savedInstanceState) {7 super.onCreate(savedInstanceState);8
9 sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE);10
11 // Configure Adjust SDK12 String appToken = "{YourAppToken}";13 String environment = BuildConfig.DEBUG ? AdjustConfig.ENVIRONMENT_SANDBOX : AdjustConfig.ENVIRONMENT_PRODUCTION;14 AdjustConfig config = new AdjustConfig(this, appToken, environment);15
16 config.setLogLevel(BuildConfig.DEBUG ? LogLevel.VERBOSE : LogLevel.SUPPRESS);17
18 // Receive deferred deep link via listener19 config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() {20 @Override21 public boolean launchReceivedDeeplink(Uri deeplink) {22 if (deeplink == null) {23 return false;24 }25
26 boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);27
28 if (hasCompletedOnboarding) {29 // If onboarding is complete, handle deferred deep link immediately30
31 /*32 * deep link format:33 *34 * example://summer-clothes?promo=beach&adj_t=def45635 *36 * TODO: Handle the deep link and navigate to the appropriate screen.37 */38 } else {39 // Store deferred deep link to invoke after onboarding screens and login40 sharedPreferences.edit()41 .putString("deferred_link", deeplink.toString())42 .apply();43 }44
45 // The app controls when and how it handles the deferred deep link, so return false.46 return false;47 }48 });49
50 // Initialize SDK51 Adjust.onCreate(config);52
53 boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);54
55 if (hasCompletedOnboarding) {56 // Show main content57 } else {58 // Show onboarding screens and login prompt59 }60 }61
62 // This logic runs when the user finishes the onboarding flow63 private void onOnboardingFinished() {64 // Set hasCompletedOnboarding to true65 sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply();66
67 // Check for deferred deep link received before or during onboarding68 // Exit if no deferred deep link was stored69 String deferredLinkString = sharedPreferences.getString("deferred_link", null);70 if (deferredLinkString == null) {71 return;72 }73
74 // Remove the stored deep link to prevent it from being handled again75 sharedPreferences.edit().remove("deferred_link").apply();76
77 // Convert the stored string back to a Uri object78 Uri deeplink = Uri.parse(deferredLinkString);79
80 /*81 * deep link format:82 *83 * example://summer-clothes?promo=beach&adj_t=def45684 *85 * TODO: Handle the deep link and navigate to the appropriate screen.86 */87 }88}