فیلترهای Intent را برای پیوندهای برنامه اضافه کنید

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

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

در زیر مثالی از اعلان App Link به همراه schemes و hosts و همچنین 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" برای App Links الزامی است. این ویژگی به سیستم سیگنال می‌دهد که باید تلاش کند تا ارتباط بین برنامه شما و طرح‌ها و دامنه(های) مشخص شده در تگ‌های <data> را تأیید کند. توصیه می‌شود autoVerify="true " را به هر فیلتر Intent که می‌خواهید قابل تأیید باشد، اضافه کنید.
  • عناصر داده : هر فیلتر App Links Intent باید شامل یک یا چند عنصر <data> باشد که طرح‌ها و قالب‌های میزبان منطبق با دامنه وب‌سایت قابل تأیید شما را مشخص می‌کنند.
  • طرح‌ها : فیلتر intent باید شامل عناصر <data> برای هر دو طرح http و https باشد.
  • میزبان‌ها : می‌توانید به صورت اختیاری عناصر <data> را برای مطابقت با یک یا چند میزبان اضافه کنید. از علامت * برای مطابقت با چندین زیر دامنه (مانند *.example.com ) استفاده کنید. سیستم تلاش می‌کند تا هر میزبان را با فایل assetlinks.json در وب‌سایت شما تأیید کند. توجه داشته باشید که هرگونه مسیریابی در سطح مسیر باید توسط فایل assetlinks.json انجام شود (به بخش بهترین شیوه‌ها در زیر مراجعه کنید).

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

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

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

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

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

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

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

پشتیبانی از لینک‌های برنامه برای چندین میزبان

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

برای مثال، یک برنامه با فیلترهای intent زیر، فقط در صورتی که فایل assetlinks.json در https://www.example.com/.well-known/assetlinks.json https://www.example.com شود، اما 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 به عنوان میزبان‌های URL هدف پذیرفته شده است. بنابراین یک 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>

از طرف دیگر، اگر نام میزبان خود را با یک wildcard (مانند *.example.com ) اعلام کنید، باید فایل assetlinks.json خود را در نام میزبان ریشه ( example.com ) منتشر کنید. برای مثال، برنامه‌ای با فیلتر intent زیر، برای هر زیرنام 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 باشد. کاربر می‌تواند برنامه مورد نظر خود را از لیست برنامه‌های منطبق که در کادر محاوره‌ای ظاهر می‌شوند، انتخاب کند.

ویژگی‌های Dynamic App Link، از جمله قوانین تطبیق پیشرفته در assetlinks.json و استفاده از <uri-relative-filter-group> ، فقط در اندروید ۱۵ (سطح API 35) و بالاتر به طور کامل پشتیبانی می‌شوند.

در اندروید ۱۴ (سطح API ۳۴) و پایین‌تر، سیستم فقط scheme و host اعلام‌شده در عناصر <data> مانیفست شما را برای تأیید App Link در نظر می‌گیرد. قوانین خاص مسیر، استثنائات و به‌روزرسانی‌های پویا از assetlinks.json اعمال نمی‌شوند.

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

برای جلوگیری از اینکه برنامه شما در اندروید ۱۴ و پایین‌تر، تمام لینک‌های یک دامنه را مدیریت کند، وقتی قصد دارید از Dynamic App Links برای مسیرهای خاص‌تر در اندروید ۱۵ و بالاتر استفاده کنید، یک مسیر نامتناسب را در فیلتر intent مانیفست خود قرار دهید. یک عنصر <data> با ویژگی android:path اضافه کنید که بعید است هرگز یک مسیر معتبر برای لینک‌های شما باشد. این تضمین می‌کند که فیلتر intent در نسخه‌های پایین‌تر با تمام مسیرها مطابقت نداشته باشد.

مثال:

<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" /> ، شما اطمینان حاصل می‌کنید که در اندروید ۱۴ و پایین‌تر، این فیلتر intent با هیچ لینک ورودی مطابقت ندارد، در حالی که همچنان اجازه می‌دهد دامنه برای استفاده با Dynamic App Links در اندروید ۱۵ و بالاتر بر اساس قوانین تطبیق پیشرفته در قوانین assetlinks.json شما تأیید شود.

اگر از قبل App Links با قوانین مسیر خاص (مانند android:pathPrefix ) را در مانیفست خود دارید و می‌خواهید از Dynamic App Links در اندروید ۱۵ و بالاتر استفاده کنید، می‌توانید با خیال راحت عنصر <uri-relative-filter-group> را مستقیماً به فیلترهای intent موجود خود اضافه کنید.

از آنجا که اندروید ۱۴ و پایین‌تر عنصر <uri-relative-filter-group> را نادیده می‌گیرد، App Link های موجود شما دقیقاً مانند الان در دستگاه‌هایی که نسخه‌های پایین‌تر اندروید را اجرا می‌کنند، به کار خود ادامه می‌دهند.

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

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

مثالی از پیکربندی ترکیبی:

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