ایجاد پیوندهای عمیق

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

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

برای پیوندهای عمیقی که به وب‌سایت یا دامنه‌های خودتان ارجاع می‌دهند، توصیه می‌کنیم از «پیوندهای برنامه» استفاده کنید که تجربه‌ای یکپارچه و مطمئن برای کاربران فراهم می‌کند.

نحوه عملکرد پیوند عمیق

پیوند عمیق یک قابلیت سیستم عمومی Android است که در همه نسخه‌ها و در همه دستگاه‌ها پشتیبانی می‌شود. این کتابخانه از سیستم Intents در Android برای مسیریابی پیوندهای عمیق به برنامه‌های علاقه‌مند استفاده می‌کند. برنامه‌هایی که می‌خواهند یک URI پیوند عمیق خاص را مدیریت کنند، یک فیلتر Intent منطبق را در فایل‌های مانیفست برنامه خود اعلام می‌کنند.

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

  1. برنامه پیش‌فرض کاربر را که می‌تواند URI را مدیریت کند باز کنید (اگر برنامه‌ای تعیین شده باشد).
  2. تنها برنامه دردسترسی را که می‌تواند URI را مدیریت کند باز کنید.
  3. به کاربر اجازه دهید برنامه‌ای را از کادر گفتگوی ابهام‌زدایی انتخاب کند.

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

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

کادر گفتگوی ابهام‌زدایی سیستم Android که گزینه‌های برنامه را برای پیوند نشان می‌دهد.
شکل ۱. کادر گفتگوی ابهام‌زدایی

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

انواع پیوندهای عمیق

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

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

افزودن فیلترهای هدف برای پیوندهای ورودی

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

<action>

کنش هدف ACTION_VIEW را مشخص کنید تا فیلتر هدف بتواند از «جستجوی Google» قابل‌دسترسی باشد.

<data>

یک یا چند برچسب <data> اضافه کنید که هرکدام نشان‌دهنده قالب URI است که به فعالیت منتهی می‌شود. برچسب <data> باید حداقل شامل مشخصه android:scheme باشد.

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

<category>

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

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

تکه‌کد XML زیر نشان می‌دهد که چگونه می‌توانید فیلتر هدف را در مانیفست خود برای پیوند عمیق مشخص کنید. هر دو شناسه منبع یکسان "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>

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

<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.

وقتی فیلترهای قصد را با URI برای محتوای فعالیت به مانیفست برنامه‌تان اضافه کردید، Android می‌تواند هر Intent را که URI منطبق دارد در زمان اجرا به برنامه‌تان هدایت کند.

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

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

وقتی سیستم فعالیت شما را ازطریق فیلتر قصد شروع می‌کند، می‌توانید از داده‌های ارائه‌شده توسط Intent برای تعیین آنچه باید ارائه دهید استفاده کنید. روش‌های getData() و getAction() را برای بازیابی داده‌ها و کنش مرتبط با Intent ورودی فراخوانی کنید. می‌توانید این روش‌ها را در هر زمانی درطول چرخه حیات فعالیت فراخوانی کنید، اما معمولاً باید این کار را درطول فراخوانی‌های برگشتی اولیه مانند 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 با ابزار مدیر فعالیت (am) استفاده کنید تا آزمایش کنید که URIهای فیلتر قصد که برای پیوند عمیق مشخص کرده‌اید به فعالیت برنامه صحیح حل می‌شوند. می‌توانید فرمان adb را در دستگاه یا شبیه‌ساز اجرا کنید.

نحو کلی برای آزمایش URI فیلتر قصد با 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

از Android 17 به بعد، می‌توانید از پرچم --debug-link با am start نیز استفاده کنید تا نحوه حل‌وفصل نشانی وب توسط سیستم را تشخیص دهید و فیلترهای قصد منطبق یا قوانین «پیوند برنامه پویا» را بررسی کنید. برای اطلاعات بیشتر، تشخیص وضوح پیوند با پرچم debug-link را ببینید.

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

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