لینک های عمیق ایجاد کنید

لینک‌های عمیق به شما این امکان را می‌دهند که کاربران را مستقیماً از مرورگرهای وب، اعلان‌ها، رسانه‌های اجتماعی، تبلیغات و سایر منابع به برنامه خود هدایت کنید. لینک‌های عمیق انتقال مستقیم از برنامه به برنامه و از وب به برنامه را فراهم می‌کنند که می‌تواند به شما در افزایش تعامل از طریق محتوای متنی و هدفمند کمک کند.

این راهنما توضیح می‌دهد که لینک‌سازی عمیق چگونه کار می‌کند و چگونه می‌توان لینک‌های عمیق به محتوای خود ایجاد و آزمایش کرد.

برای لینک‌های عمیقی که به وب‌سایت یا دامنه‌های خودتان ارجاع می‌دهند، توصیه می‌کنیم از App Links استفاده کنید که یک تجربه یکپارچه و قابل اعتماد را برای کاربران شما فراهم می‌کند.

نحوه عملکرد لینک سازی عمیق

لینک‌دهی عمیق (Deep linking) یک قابلیت سیستمی عمومی اندروید است که در همه نسخه‌ها و همه دستگاه‌ها پشتیبانی می‌شود. این قابلیت از سیستم Intents اندروید برای مسیریابی لینک‌های عمیق به برنامه‌های مورد نظر استفاده می‌کند. برنامه‌هایی که می‌خواهند یک URL لینک عمیق خاص را مدیریت کنند، یک فیلتر Intent منطبق را در فایل‌های مانیفست برنامه خود اعلام می‌کنند.

در زمان اجرا، وقتی کاربر روی یک لینک کلیک می‌کند، اندروید یک اینتنت را فعال می‌کند و سعی می‌کند آن را به یک برنامه هدایت کند. از آنجایی که چندین برنامه می‌توانند فیلترهای اینتنت را که با یک URI مشخص مطابقت دارند، تعریف کنند، اندروید این اقدامات را به ترتیب زیر برای هدایت اینتنت انجام می‌دهد:

  1. برنامه پیش‌فرض کاربر که می‌تواند URI را مدیریت کند، در صورت وجود، باز کنید.
  2. تنها برنامه‌ی موجود که می‌تواند URI را مدیریت کند، باز کنید.
  3. به کاربر اجازه دهید یک برنامه را از یک کادر محاوره‌ای ابهام‌زدایی انتخاب کند.

این بدان معناست که حتی اگر فیلترهای اینتنت شما با یک URI مشخص مطابقت داشته باشند، هیچ تضمینی وجود ندارد که سیستم، اینتنت لینک عمیق را به برنامه شما هدایت کند. کاربر نقش کلیدی در مدیریت اینکه کدام برنامه اینتنت را مدیریت کند، دارد که به او کنترل و حق انتخاب می‌دهد. برای کنترل بیشتر بر روی لینک‌های عمیق به وب‌سایت و دامنه‌های خود، از App Links استفاده کنید.

پنجره‌ی ابهام‌زدایی اندروید به کاربر اجازه می‌دهد تا تمام برنامه‌های نصب‌شده‌ای را که برای مدیریت یک هدف پیوند عمیق ثبت‌نام کرده‌اند، مشاهده کند. کاربر همچنین می‌تواند یک برنامه را به عنوان پیش‌فرض برای این نوع پیوند انتخاب کند. هنگامی که کاربر یک پیش‌فرض را تنظیم می‌کند، سیستم دیگر پنجره‌ی مربوط به آن هدف خاص را نشان نمی‌دهد و برنامه‌ی انتخاب‌شده به طور خودکار باز می‌شود.

شکل ۱. پنجره‌ی ابهام‌زدایی

رفتار کادر محاوره‌ای ابهام‌زدایی در نسخه‌های مختلف اندروید تکامل یافته است. برای مثال، در اندروید ۱۲ و بالاتر، لینک‌های وبی که App Links آنها تأیید نشده باشد، معمولاً به‌طور پیش‌فرض در یک مرورگر وب باز می‌شوند، در حالی که در نسخه‌های قبلی، اگر برنامه‌ای می‌توانست لینک وب را مدیریت کند، ممکن بود یک کادر محاوره‌ای ابهام‌زدایی ظاهر شود.

نکته : از اندروید ۱۲ (سطح API 31)، یک web intent عمومی فقط در صورتی به یک activity در برنامه شما resolve می‌شود که برنامه شما برای دامنه خاص موجود در آن web intent تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، web intent به جای آن به برنامه مرورگر پیش‌فرض کاربر resolve می‌شود.

انواع لینک‌های عمیق

سه نوع لینک عمیق وجود دارد که می‌توانید در اندروید از آنها پشتیبانی کنید:

  • پیوندهای عمیق سفارشی : اینها پیوندهای عمیقی هستند که از یک طرح URI سفارشی (مانند example://products/123 ) استفاده می‌کنند تا کاربر را مستقیماً به یک محتوای خاص در یک برنامه هدایت کنند. آنها برای پیمایش داخلی یا پیوندهایی از منابعی که شما کنترل می‌کنید قدرتمند هستند، اما پیوندهای وب استاندارد نیستند و اگر برنامه دیگری همان طرح سفارشی را ثبت کند، همچنان می‌توانند گفتگوی ابهام‌زدایی را فعال کنند.
  • لینک‌های وب : این‌ها لینک‌های عمیقی هستند که از طرح‌های استاندارد http و https استفاده می‌کنند. آن‌ها به دلیل اینکه URLهای استاندارد هستند، تطبیق‌پذیرترند، اما در اندروید ۱۲ و بالاتر تقریباً همیشه پنجره‌ی ابهام‌زدایی را فعال می‌کنند، به این معنی که احتمالاً به طور پیش‌فرض توسط مرورگر وب کاربر مدیریت می‌شوند، نه اینکه به برنامه‌ی شما هدایت شوند.
  • پیوندهای برنامه : این پیوندها از اندروید ۶.۰ (سطح API ۲۳) در دسترس هستند و پیوندهای وب تأیید شده‌ای هستند. از طریق فرآیند ارتباط وب‌سایت، می‌توانید به سیستم اندروید ثابت کنید که مالک دامنه هستید. پس از تأیید، سیستم به طور خودکار پیوندهای آن دامنه را مستقیماً به برنامه شما هدایت می‌کند و به طور کامل از پنجره ابهام‌زدایی صرف نظر می‌کند. این امر یک تجربه قابل اعتماد و یکپارچه برای کاربران شما ایجاد می‌کند.

فیلترهای هدف را برای لینک‌های ورودی اضافه کنید

برای ایجاد لینک به محتوای برنامه خود، یک فیلتر intent که شامل این عناصر و مقادیر ویژگی در مانیفست شما باشد، اضافه کنید:

<action>

اکشن اینتنت ACTION_VIEW را مشخص کنید تا بتوان از طریق جستجوی گوگل به فیلتر اینتنت دسترسی پیدا کرد.

<data>

یک یا چند تگ <data> اضافه کنید که هر کدام نشان دهنده یک فرمت URI باشند که به activity مربوط می‌شود. حداقل، تگ <data> باید شامل ویژگی android:scheme باشد.

شما می‌توانید ویژگی‌های بیشتری را برای اصلاح بیشتر نوع URI که فعالیت می‌پذیرد، اضافه کنید. برای مثال، ممکن است چندین فعالیت داشته باشید که URI های مشابهی را می‌پذیرند، اما صرفاً بر اساس نام مسیر متفاوت هستند. در این حالت، از ویژگی android:path یا انواع pathPattern یا pathPrefix آن برای تمایز قائل شدن بین فعالیتی که سیستم باید برای مسیرهای URI مختلف باز کند، استفاده کنید.

<category>

دسته BROWSABLE را اضافه کنید. این دسته برای دسترسی به فیلتر intent از طریق مرورگر وب ضروری است. بدون آن، کلیک روی یک لینک در مرورگر نمی‌تواند به برنامه شما دسترسی پیدا کند.

همچنین دسته‌ی DEFAULT را نیز اضافه کنید. این به برنامه‌ی شما اجازه می‌دهد تا به intent های ضمنی پاسخ دهد. بدون این، activity فقط در صورتی می‌تواند شروع شود که intent نام کامپوننت برنامه‌ی شما را مشخص کند.

قطعه کد XML زیر نشان می‌دهد که چگونه می‌توانید یک فیلتر intent را در مانیفست خود برای لینک‌دهی عمیق مشخص کنید. آدرس‌های اینترنتی "example://gizmos" و "http://www.example.com/gizmos" هر دو به این فعالیت مربوط می‌شوند.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

توجه داشته باشید که دو فیلتر intent فقط در عنصر <data> با هم تفاوت دارند. اگرچه می‌توان چندین عنصر <data> را در یک فیلتر قرار داد، اما مهم است که وقتی قصد دارید URL های منحصر به فردی (مانند ترکیبی خاص از scheme و host ) را اعلام کنید، فیلترهای جداگانه‌ای ایجاد کنید، زیرا چندین عنصر <data> در یک فیلتر intent در واقع با هم ادغام می‌شوند تا تمام تغییرات ویژگی‌های ترکیبی آنها را در نظر بگیرند. به عنوان مثال، موارد زیر را در نظر بگیرید:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

ممکن است به نظر برسد که این فقط از https://www.example.com و app://open.my.app پشتیبانی می‌کند. اما در واقع از این دو به علاوه‌ی app://www.example.com و https://open.my.app پشتیبانی می‌کند.

احتیاط : اگر چندین اکتیویتی حاوی فیلترهای هدف باشند که به یک لینک برنامه اندروید تأیید شده یکسان منتهی می‌شوند، هیچ تضمینی وجود ندارد که کدام اکتیویتی لینک را مدیریت می‌کند.

زمانی که فیلترهای intent را به همراه URI های مربوط به محتوای activity به manifest برنامه خود اضافه کردید، اندروید قادر است هر Intent را که URI های منطبق با آن را دارد، در زمان اجرا به برنامه شما هدایت کند.

برای کسب اطلاعات بیشتر در مورد تعریف فیلترهای هدف، به «اجازه دهید سایر برنامه‌ها فعالیت شما را شروع کنند» مراجعه کنید.

خواندن داده‌ها از intent های ورودی

زمانی که سیستم، activity شما را از طریق یک فیلتر intent آغاز می‌کند، می‌توانید از داده‌های ارائه شده توسط Intent برای تعیین آنچه که باید رندر کنید، استفاده کنید. متدهای getData() و getAction() را برای بازیابی داده‌ها و اکشن مرتبط با Intent ورودی فراخوانی کنید. می‌توانید این متدها را در هر زمانی در طول چرخه حیات activity فراخوانی کنید، اما معمولاً باید این کار را در فراخوانی‌های اولیه مانند onCreate() یا onStart انجام دهید.

در اینجا قطعه کدی وجود دارد که نحوه بازیابی داده‌ها از یک Intent را نشان می‌دهد:

کاتلین

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

جاوا

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

برای بهبود تجربه کاربری، این بهترین شیوه‌ها را دنبال کنید:

  • لینک عمیق باید کاربران را مستقیماً به محتوا هدایت کند، بدون هیچ گونه اعلان، صفحات بینابینی یا ورود به سیستم. مطمئن شوید که کاربران می‌توانند محتوای برنامه را ببینند، حتی اگر قبلاً هرگز برنامه را باز نکرده باشند. اشکالی ندارد که کاربران را در تعاملات بعدی یا وقتی برنامه را از طریق لانچر باز می‌کنند، مطلع کنید.
  • دستورالعمل‌های طراحی شرح داده شده در «پیمایش با بازگشت و بالا» را دنبال کنید تا برنامه شما با انتظارات کاربران برای پیمایش به عقب پس از ورود به برنامه از طریق یک لینک عمیق، مطابقت داشته باشد.

لینک‌های عمیق خود را آزمایش کنید

شما می‌توانید از Android Debug Bridge به همراه ابزار activity manager (am) برای آزمایش اینکه آیا URI های فیلتر intent که برای deep linking مشخص کرده‌اید به activity صحیح برنامه مربوط می‌شوند یا خیر، استفاده کنید. می‌توانید دستور adb را روی یک دستگاه یا یک شبیه‌ساز اجرا کنید.

سینتکس کلی برای تست یک URI فیلتر intent با adb به صورت زیر است:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

برای مثال، دستور زیر سعی می‌کند فعالیت برنامه‌ی هدف را که با URI مشخص شده مرتبط است، مشاهده کند.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

نکته : هنگام تعریف مجموعه‌ای از انواع اولیه در یک مسیر، مانند **@Serializable data class Product(val colors: List)** ، فرمت URL لینک عمیق که به طور خودکار ایجاد می‌شود **basePath?colors={value**} است. اگر سعی کنید یک URI را با چندین پارامتر پرس‌وجو مشخص کنید (برای مثال، **basepath?colors=red&colors=blue** )، باید از علامت & (مثلاً **basepath?colors=red\&colors=blue** ) صرف نظر کنید.

اعلان مانیفست و کنترل‌کننده‌ی اینتنت که تنظیم می‌کنید، ارتباط بین برنامه‌ی شما و یک وب‌سایت و نحوه‌ی برخورد با لینک‌های ورودی را تعریف می‌کنند. با این حال، برای اینکه سیستم، برنامه‌ی شما را به عنوان کنترل‌کننده‌ی پیش‌فرض برای مجموعه‌ای از URIها در نظر بگیرد، باید از سیستم درخواست کنید که این ارتباط را تأیید کند. بخش «تأیید پیوندهای برنامه» نحوه‌ی پیاده‌سازی این تأیید را توضیح می‌دهد.

برای کسب اطلاعات بیشتر در مورد intentها و لینک‌های برنامه، به منابع زیر مراجعه کنید: