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

«پیوندهای برنامه» پیوندهای عمیقی هستند که از طرح HTTP یا HTTPS استفاده می‌کنند و Android آن‌ها را به‌عنوان پیوندهای مرتبط با وب‌سایت شما تأیید می‌کند. برای ثبت‌نام جهت مدیریت «پیوندهای برنامه»، این مراحل را دنبال کنید:

  1. یک یا چند فیلتر «قصد» به مانیفست برنامه‌تان اضافه کنید که دامنه یا نشانی‌های وب وب‌سایتتان را مشخص کند.
  2. autoVerify="true"attribute را به عناصر فیلتر «هدف» اضافه کنید. این به سیستم علامت می‌دهد که باید طرح و دامنه(های) میزبان را دربرابر پیکربندی assetlinks.json وب‌سایتتان درستی‌سنجی کند.
  3. ارتباط‌های وب‌سایت را اعلام کنید.

در زیر نمونه‌ای از اظهارنامه «پیوند برنامه» با طرح‌واره‌ها و میزبان‌ها و همچنین autoVerify="true آورده شده است:

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <!-- Make sure you explicitly set android:autoVerify to "true". -->
    <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" />

        <!-- If a user clicks on a link that uses the "http" scheme, your
             app should be able to delegate that traffic to "https". -->
        <!-- Do not include other schemes, as this will prevent verification. -->
        <data android:scheme="http" />
        <data android:scheme="https" />

        <!-- Include one or more domains that should be verified. -->
        <data android:host="www.example.com" />
        <data android:host="*.example.com" />
    </intent-filter>
</activity>

نکات کلیدی درباره کد

  • AutoVerify: مشخصه android:autoVerify="true" برای «پیوندهای برنامه» الزامی است. این ویژگی به سیستم علامت می‌دهد که باید تلاش کند ارتباط بین برنامه شما و طرح‌ها و دامنه‌های مشخص‌شده در برچسب‌های <data> را درستی‌سنجی کند. توصیه می‌شود autoVerify="true را به هر فیلتر «قصدی» که می‌خواهید قابل‌تأیید باشد اضافه کنید.
  • عناصر داده: هر فیلتر هدف «پیوندهای برنامه» باید شامل یک یا چند عنصر <data> باشد که طرح‌ها و قالب‌های میزبانی را که با دامنه وب‌سایت قابل‌تأیید شما مطابقت دارد مشخص کند.
  • طرح‌ها: فیلتر قصد باید شامل عناصر <data> برای هر دو طرح http و https باشد.
  • میزبان‌ها: می‌توانید به‌طور اختیاری عناصر <data> را برای مطابقت با یک یا چند میزبان اضافه کنید. از نویسه عام (*) برای مطابقت دادن چندین زیردامنه (مانند *.example.com) استفاده کنید. سیستم تلاش می‌کند هر میزبان را با فایل assetlinks.json در وب‌سایتتان درستی‌سنجی کند. توجه داشته باشید که هرگونه مسیریابی در سطح مسیر باید توسط فایل assetlinks.json انجام شود (بخش روال‌های مطلوب زیر را ببینید).

  • چند میزبان: اگر چند دامنه میزبان اعلام کنید، سیستم (در Android نسخه ۱۲ و بالاتر) تلاش می‌کند هرکدام را درستی‌سنجی کند. اگر هر میزبانی درستی‌سنجی شود، برنامه به کنترل‌کننده پیش‌فرض برای پیوندهای آن میزبان درستی‌سنجی‌شده تبدیل می‌شود. در Android نسخه ۱۱ و پایین‌تر، اگر حتی یک میزبان درستی‌سنجی نشود، درستی‌سنجی ناموفق خواهد بود.

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

ملاحظات مربوط به قوانین فیلتر مانیفست

اگر درحال راه‌اندازی فیلترهایی برای استفاده با «پیوندهای پویای برنامه» در Android نسخه ۱۵ و بالاتر هستید، باید به‌خاطر داشته باشید که قوانین پویای اعلام‌شده در فایل assetlinks.json سمت سرور نمی‌توانند دامنه قوانین نشانی وب را که به‌صورت ایستا در مانیفست برنامه‌تان اعلام می‌کنید گسترش دهند.

به همین دلیل، توصیه می‌کنیم از این رویکرد استفاده کنید:

  • در مانیفست برنامه‌تان، گسترده‌ترین دامنه ممکن را تنظیم کنید، مثلاً با اعلام فقط طرح و دامنه
  • برای پالایش بیشتر، مانند مسیریابی در سطح مسیر، به قوانین assetlinks.json سمت سرور تکیه کنید.

با این پیکربندی ایده‌آل، می‌توانید به‌طور پویا مسیرهای جدید «پیوندهای برنامه» را در فایل assetlinks.json اضافه کنید، با این اطمینان که این مسیرها در محدوده وسیعی که در مانیفست برنامه تنظیم کرده‌اید قرار خواهند گرفت.

پشتیبانی از «پیوندهای برنامه» برای چند میزبان

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

برای مثال، برنامه‌ای با فیلترهای قصد زیر فقط برای https://www.example.com درستی‌سنجی را می‌گذراند اگر فایل assetlinks.json در https://www.example.com/.well-known/assetlinks.json پیدا شود اما در https://www.example.net/.well-known/assetlinks.json پیدا نشود:

<application>

  <activity android:name="MainActivity">
    <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="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name="SecondActivity">
    <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="https" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

پشتیبانی از پیونددهی برنامه برای چند زیردامنه

پروتکل «پیوندهای دارایی دیجیتال» با زیردامنه‌ها در فیلترهای قصد شما به‌عنوان میزبان‌های مجزا و منحصربه‌فرد رفتار می‌کند. بنابراین اگر فیلتر قصد شما چندین میزبان با زیردامنه‌های مختلف را فهرست می‌کند، باید assetlinks.json معتبری را در هر دامنه منتشر کنید. برای مثال، فیلتر هدف زیر شامل www.example.com و mobile.example.com به‌عنوان میزبان‌های نشانی وب هدف پذیرفته‌شده است. بنابراین assetlinks.json معتبر باید هم در https://www.example.com/.well-known/assetlinks.json و هم در https://mobile.example.com/.well-known/assetlinks.json منتشر شود.

<application>
  <activity android:name="MainActivity">
    <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="https" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

یا اگر نام میزبان را با نویسه عام (مثل *.example.com) اعلام می‌کنید، باید فایل assetlinks.json را در نام میزبان ریشه (example.com) منتشر کنید. برای مثال، برنامه‌ای با فیلتر قصد زیر درستی‌سنجی را برای هر نام فرعی example.com (مثل foo.example.com) می‌گذراند، به‌شرطی که فایل assetlinks.json در https://example.com/.well-known/assetlinks.json منتشر شده باشد:

<application>
  <activity android:name="MainActivity">
    <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="https" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

بررسی کنید که چند برنامه با یک دامنه مرتبط نباشد

اگر چند برنامه منتشر می‌کنید که هرکدام با دامنه یکسانی مرتبط هستند، هرکدام از آن‌ها می‌توانند با موفقیت تأیید شوند. بااین‌حال، اگر برنامه‌ها بتوانند دقیقاً همان میزبان و مسیر دامنه را حل‌وفصل کنند، همان‌طور که ممکن است در نسخه‌های سبک و کامل یک برنامه اتفاق بیفتد، فقط برنامه‌ای که اخیراً نصب شده است می‌تواند هدف‌های وب را برای آن دامنه حل‌وفصل کند.

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

ویژگی‌های «پیوند برنامه پویا»، ازجمله قوانین مطابقت پیشرفته در assetlinks.json و استفاده از <uri-relative-filter-group>، فقط در Android 15 (سطح میانای برنامه‌سازی کاربردی ۳۵) و بالاتر به‌طور کامل پشتیبانی می‌شود.

در Android 14 (سطح API‏ ۳۴) و نسخه‌های پایین‌تر، سیستم فقط scheme و host اعلام‌شده در عناصر <data> مانیفست شما را برای درستی‌سنجی «پیوند برنامه» درنظر می‌گیرد. قوانین، استثناها، و به‌روزرسانی‌های پویا از assetlinks.json که مختص مسیر هستند اعمال نمی‌شوند.

این یعنی اگر مانیفست شما فقط scheme و host را مشخص کند، ممکن است برنامه‌تان به‌طور غیرمنتظره‌ای همه مسیرهای دامنه تأییدشده را در Android 14 و نسخه‌های پایین‌تر ضبط کند، صرف‌نظر از قوانین خاص مسیر که در assetlinks.json شما برای Android 15 و نسخه‌های بالاتر تعریف شده است.

برای جلوگیری از اینکه برنامه‌تان همه پیوندهای یک دامنه را در Android 14 و نسخه‌های پایین‌تر مدیریت کند، وقتی قصد دارید از «پیوندهای پویای برنامه» برای مسیرهای خاص‌تر در Android 15 و نسخه‌های بالاتر استفاده کنید، یک مسیر غیرمنطبق را در فیلتر قصد مانیفست خود بگنجانید. عنصر <data> را با مشخصه android:path اضافه کنید که بعید است هرگز مسیر معتبری برای پیوندهایتان باشد. این کار تضمین می‌کند که فیلتر قصد با همه مسیرها در نسخه‌های پایین‌تر مطابقت نداشته باشد.

مثال:

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <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="www.example.com" />

        <!-- Add a non-matching path for backward compatibility -->
        <data android:path="/no_match_for_older_android_versions" />

        <uri-relative-filter-group android:allow="true">
          <data android:pathPattern="/.*"/>
        </uri-relative-filter-group>
    </intent-filter>
</activity>

با افزودن <data android:path="/no_match_for_older_android_versions" />، مطمئن می‌شوید که در Android 14 و نسخه‌های پایین‌تر، این فیلتر قصد با هیچ‌یک از پیوندهای ورودی مطابقت ندارد، درحالی‌که همچنان اجازه می‌دهد دامنه برای استفاده با «پیوندهای پویای برنامه» در Android 15 و نسخه‌های بالاتر براساس قوانین مطابقت پیشرفته در قوانین assetlinks.json شما درستی‌سنجی شود.

اگر ازقبل «پیوندهای برنامه» با قوانین مسیر خاص (مثل android:pathPrefix) در مانیفست خود دارید و می‌خواهید استفاده از «پیوندهای برنامه پویا» را در Android 15 و بالاتر شروع کنید، می‌توانید عنصر <uri-relative-filter-group> را مستقیماً به فیلترهای قصد موجود خود اضافه کنید.

چون Android 14 و نسخه‌های پایین‌تر عنصر <uri-relative-filter-group> را نادیده می‌گیرند، «پیوندهای برنامه» موجود شما همچنان دقیقاً مانند الان در دستگاه‌های دارای نسخه‌های پایین‌تر Android کار می‌کنند.

بااین‌حال، باید به‌دقت درنظر بگیرید که Android 15 و بالاتر چگونه پیکربندی «مختلط» را ارزیابی می‌کند:

  • فیلتر کردن دولایه: در Android 15 و بالاتر، سیستم فیلترهای قصد را به‌عنوان یک اتحاد ارزیابی می‌کند. اگر نشانی وب با برچسب‌های <data> قدیمی ثابت شما یا قوانین کلی در <uri-relative-filter-group> مطابقت داشته باشد، بررسی مانیفست را با موفقیت می‌گذراند. وقتی نشانی وب این بررسی مانیفست اولیه را با موفقیت پشت سر گذاشت، سیستم سپس قوانین پویای تعریف‌شده در فایل assetlinks.json شما را به‌عنوان لایه دوم فیلتر کردن دقیق اعمال می‌کند. این یعنی قوانین JSON سمت سرور درنهایت تعیین می‌کنند کدام‌یک از آن نشانی‌های وب مطابقت‌داده‌شده واقعاً برنامه را باز کنند.

نمونه‌ای از پیکربندی ترکیبی:

<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="https" />
    <data android:host="www.example.com" />

    <!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
         also use this. -->
    <data android:pathPrefix="/store" />

    <!--
      Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
      evaluate this as a union between all paths and the configuration
      specified in the assetlinks.json file. Make sure to apply further
      refinements in the assetlinks.json file to prevent all URL paths from
      opening in the app.
    -->
    <uri-relative-filter-group android:allow="true">
        <data android:pathPrefix="/" />
    </uri-relative-filter-group>
</intent-filter>