پیوندهای برنامه Android را تأیید کنید

پیوند برنامه اندروید نوع خاصی از پیوند عمیق است که به URL های وب سایت شما اجازه می دهد بلافاصله محتوای مربوطه را در برنامه اندروید شما باز کنند، بدون اینکه کاربر مجبور شود برنامه را انتخاب کند. پیوندهای برنامه Android از Digital Asset Links API استفاده می کنند تا اطمینان حاصل کنند که برنامه شما توسط وب سایت تأیید شده است تا به طور خودکار پیوندها را برای آن دامنه باز کند. اگر سیستم با موفقیت تأیید کند که شما صاحب URL ها هستید، سیستم به طور خودکار آن اهداف URL را به برنامه شما هدایت می کند.

برای تأیید اینکه شما هم مالک برنامه و هم نشانی وب سایت هستید، مراحل زیر را انجام دهید:

  1. فیلترهای intent را که حاوی ویژگی autoVerify هستند اضافه کنید. این ویژگی به سیستم سیگنال می دهد که باید بررسی کند که آیا برنامه شما به دامنه های URL استفاده شده در فیلترهای هدف شما تعلق دارد یا خیر.

  2. ارتباط بین وب سایت خود و فیلترهای هدف خود را با میزبانی یک فایل JSON Links دارایی دیجیتال در مکان زیر اعلام کنید :

    https://domain.name/.well-known/assetlinks.json

اطلاعات مرتبط را می توانید در منابع زیر بیابید:

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

برای فعال کردن تأیید مدیریت پیوند برای برنامه خود، فیلترهای هدف را اضافه کنید که با قالب زیر مطابقت دارند:

<!-- 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 shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

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

اگرچه کافی است که autoVerify فقط در یک اعلان <intent-filter> برای هر میزبان قرار دهید، حتی اگر آن میزبان در سایر اعلان‌های بدون علامت استفاده شود، توصیه می‌شود برای سازگاری، autoVerify به هر عنصر <intent-filter> اضافه کنید. این همچنین تضمین می‌کند که پس از حذف یا اصلاح عناصر در فایل مانیفست، برنامه شما با تمام دامنه‌هایی که هنوز تعریف می‌کنید مرتبط باقی بماند.

فرآیند تأیید دامنه نیاز به اتصال به اینترنت دارد و ممکن است مدتی طول بکشد تا تکمیل شود. برای کمک به بهبود کارایی فرآیند، سیستم دامنه‌ای را برای برنامه‌ای تأیید می‌کند که اندروید 12 یا بالاتر را هدف قرار می‌دهد، تنها در صورتی که آن دامنه در یک عنصر <intent-filter> باشد که حاوی قالب دقیق مشخص‌شده در قطعه کد قبلی باشد.

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

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

توجه: در Android 11 (سطح API 30) و پایین‌تر، سیستم برنامه شما را به‌عنوان یک کنترل‌کننده پیش‌فرض تأیید نمی‌کند، مگر اینکه فایل پیوندهای دارایی دیجیتال منطبق را برای همه میزبان‌هایی که در مانیفست تعریف کرده‌اید پیدا کند.

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

توجه: همه عناصر <data> در فیلتر intent یکسان با هم ادغام می شوند تا همه تغییرات ویژگی های ترکیبی آنها را در نظر بگیرند. به عنوان مثال، اولین فیلتر قصد در بالا شامل یک عنصر <data> است که فقط طرح HTTPS را اعلام می کند. اما با عنصر دیگر <data> ترکیب می‌شود تا فیلتر قصد از هر دو http://www.example.com و https://www.example.com پشتیبانی کند. به این ترتیب، زمانی که می‌خواهید ترکیب‌های خاصی از طرح‌ها و دامنه‌های URI را تعریف کنید، باید فیلترهای هدف جداگانه ایجاد کنید.

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

پروتکل Digital Asset Links با زیردامنه ها در فیلترهای هدف شما به عنوان میزبان های منحصر به فرد و مجزا رفتار می کند. بنابراین اگر فیلتر قصد شما چندین میزبان را با زیر دامنه های مختلف لیست می کند، باید یک 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>

از طرف دیگر، اگر نام میزبان خود را با علامت عام اعلام کنید (مانند *.example.com )، باید فایل assetlinks.json خود را در نام میزبان اصلی ( example.com ) منتشر کنید. به عنوان مثال، تا زمانی که فایل assetlinks.json در https://example.com/.well-known/assetlinks.json منتشر شده باشد، برنامه‌ای با فیلتر هدف زیر، تأیید را برای هر نام فرعی example.com (مانند foo.example.com ) ارسال می‌کند. 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() است. کاربر می تواند برنامه مورد نظر خود را از لیست برنامه های منطبق که در کادر گفتگو ظاهر می شود انتخاب کند.

انجمن های وب سایت را اعلام کنید

یک فایل JSON Links دارایی دیجیتال باید در وب سایت شما منتشر شود تا برنامه های Android مرتبط با وب سایت را نشان دهد و اهداف URL برنامه را تأیید کند. فایل JSON از فیلدهای زیر برای شناسایی برنامه‌های مرتبط استفاده می‌کند:

  • package_name : شناسه برنامه اعلام شده در فایل build.gradle برنامه.
  • sha256_cert_fingerprints : اثر انگشت SHA256 گواهی امضای برنامه شما. برای ایجاد اثر انگشت از طریق ابزار کلید جاوا می توانید از دستور زیر استفاده کنید:
    keytool -list -v -keystore my-release-key.keystore
    
    این فیلد از چندین اثر انگشت پشتیبانی می کند که می تواند برای پشتیبانی از نسخه های مختلف برنامه شما مانند اشکال زدایی و ساخت های تولیدی استفاده شود.

    اگر از Play App Signing برای برنامه خود استفاده می‌کنید، اثرانگشت گواهی که با اجرای keytool به صورت محلی تولید می‌شود، معمولاً با نمونه موجود در دستگاه‌های کاربران مطابقت ندارد. می‌توانید تأیید کنید که آیا از Play App Signing برای برنامه خود در حساب برنامه‌نویس Play Console خود در بخش Release > Setup > App signing استفاده می‌کنید. اگر این کار را انجام دهید، قطعه JSON پیوند دارایی دیجیتال صحیح را نیز در همان صفحه برای برنامه خود خواهید یافت.

فایل مثال زیر assetlinks.json حقوق باز کردن پیوند را به یک برنامه Android com.example اعطا می کند:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

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

یک وب سایت می تواند ارتباط با چندین برنامه را در یک فایل assetlinks.json اعلام کند. فهرست فایل زیر نمونه ای از یک فایل بیانیه را نشان می دهد که ارتباط با دو برنامه را به طور جداگانه اعلام می کند و در https://www.example.com/.well-known/assetlinks.json قرار دارد:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

برنامه‌های مختلف ممکن است پیوندهایی را برای منابع مختلف تحت یک میزبان وب مدیریت کنند. به عنوان مثال، app1 ممکن است یک فیلتر قصد برای https://example.com/articles ، و app2 ممکن است یک فیلتر قصد برای https://example.com/videos اعلام کند.

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

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

چندین وب‌سایت می‌توانند ارتباط با یک برنامه را در فایل‌های assetlinks.json مربوطه خود اعلام کنند. لیست فایل های زیر نمونه ای از نحوه اعلام ارتباط example.com و example.net با app1 را نشان می دهد. لیست اول ارتباط example.com با app1 را نشان می دهد:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

لیست بعدی ارتباط example.net با app1 را نشان می دهد. فقط مکانی که این فایل ها در آن میزبانی می شوند متفاوت است ( .com و .net ):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

انتشار فایل تأیید JSON

شما باید فایل تأیید JSON خود را در مکان زیر منتشر کنید:

https://domain.name/.well-known/assetlinks.json

از موارد زیر مطمئن شوید:

  • فایل assetlinks.json با content-type application/json ارائه می شود.
  • فایل assetlinks.json باید از طریق اتصال HTTPS قابل دسترسی باشد، صرف نظر از اینکه فیلترهای هدف برنامه شما HTTPS را به عنوان طرح داده اعلام می‌کنند یا خیر.
  • فایل assetlinks.json باید بدون هیچ تغییر مسیری قابل دسترسی باشد (بدون تغییر مسیر 301 یا 302).
  • اگر پیوندهای برنامه شما از چندین دامنه میزبان پشتیبانی می کند، باید فایل assetlinks.json را در هر دامنه منتشر کنید. به پشتیبانی از پیوند برنامه برای چندین میزبان مراجعه کنید.
  • برنامه خود را با نشانی‌های وب برنامه‌نویس/آزمایش در فایل مانیفست که ممکن است برای عموم قابل دسترسی نباشد منتشر نکنید (مانند مواردی که فقط با VPN قابل دسترسی هستند). راه حل در چنین مواردی، پیکربندی انواع ساخت برای ایجاد یک فایل مانیفست متفاوت برای ساخت‌های توسعه‌دهنده است.

تأیید پیوندهای برنامه Android

هنگامی که android:autoVerify="true" حداقل در یکی از فیلترهای هدف برنامه شما وجود دارد، نصب برنامه شما بر روی دستگاهی که دارای Android نسخه 6.0 (سطح API 23) یا بالاتر است، باعث می شود سیستم به طور خودکار میزبان های مرتبط با URL های موجود را تأیید کند. فیلترهای قصد برنامه شما در اندروید 12 و بالاتر، می‌توانید فرآیند تأیید را به صورت دستی برای آزمایش منطق تأیید فراخوانی کنید .

تأیید خودکار

تأیید خودکار سیستم شامل موارد زیر است:

  1. سیستم تمام فیلترهای هدف را که شامل هر یک از موارد زیر است بررسی می کند:
    • اکشن: android.intent.action.VIEW
    • دسته‌ها: android.intent.category.BROWSABLE و android.intent.category.DEFAULT
    • طرح داده: http یا https
  2. برای هر نام میزبان منحصربه‌فردی که در فیلترهای هدف بالا یافت می‌شود، Android از وب‌سایت‌های مربوطه برای فایل پیوندهای دارایی دیجیتال در https:// hostname /.well-known/assetlinks.json درخواست می‌کند.

پس از اینکه لیست وب‌سایت‌های مرتبط با برنامه خود را تأیید کردید و تأیید کردید که فایل JSON میزبان معتبر است، برنامه را روی دستگاه خود نصب کنید. حداقل 20 ثانیه صبر کنید تا فرآیند تأیید ناهمزمان کامل شود. از دستور زیر برای بررسی اینکه آیا سیستم برنامه شما را تأیید کرده و خط‌مشی‌های صحیح مدیریت پیوند را تنظیم کرده است، استفاده کنید:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

تایید دستی

با شروع اندروید 12، می‌توانید به‌صورت دستی تأیید دامنه را برای برنامه‌ای که روی دستگاه نصب شده است فراخوانی کنید. شما می توانید این فرآیند را بدون توجه به اینکه برنامه شما اندروید 12 را هدف قرار می دهد انجام دهید.

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

برای انجام تأیید دامنه، دستگاه آزمایشی شما باید به اینترنت متصل باشد.

از فرآیند تأیید دامنه به روز شده پشتیبانی کنید

اگر برنامه شما Android 12 یا بالاتر را هدف قرار می دهد، سیستم به طور خودکار از فرآیند تأیید دامنه به روز شده استفاده می کند.

در غیر این صورت، می توانید به صورت دستی فرآیند تأیید به روز شده را فعال کنید. برای انجام این کار، دستور زیر را در پنجره ترمینال اجرا کنید:

adb shell am compat enable 175408749 PACKAGE_NAME

وضعیت پیوندهای برنامه Android را در دستگاه بازنشانی کنید

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

adb shell pm set-app-links --package PACKAGE_NAME 0 all

این دستور قبل از اینکه کاربر برنامه های پیش فرض را برای هر دامنه ای انتخاب کند، دستگاه را در همان حالتی قرار می دهد که در آن قرار دارد.

فراخوانی فرآیند تأیید دامنه

پس از بازنشانی وضعیت پیوندهای برنامه Android در دستگاه، می‌توانید خود تأیید را انجام دهید. برای انجام این کار، دستور زیر را در پنجره ترمینال اجرا کنید:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

نتایج تأیید را بررسی کنید

پس از اینکه مدتی به عامل تأیید برای تکمیل درخواست‌های خود اختصاص داد، نتایج تأیید را بررسی کنید. برای این کار دستور زیر را اجرا کنید:

adb shell pm get-app-links PACKAGE_NAME

خروجی این دستور مشابه زیر است:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

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

لیست زیر مقادیر بازگشتی احتمالی را نشان می دهد که تأیید دامنه می تواند برای یک دامنه معین برگرداند:

none
چیزی برای این دامنه ثبت نشده است. چند دقیقه دیگر صبر کنید تا عامل تأیید درخواست های مربوط به تأیید دامنه را به پایان برساند، سپس دوباره فرآیند تأیید دامنه را فراخوانی کنید .
verified
دامنه برای برنامه اعلان کننده با موفقیت تأیید شد.
approved
دامنه مورد تأیید اجباری قرار گرفت، معمولاً با اجرای یک فرمان پوسته.
denied
دامنه معمولاً با اجرای یک فرمان پوسته اجباری رد می شد.
migrated
این سیستم نتیجه فرآیند قبلی را که از راستی‌آزمایی دامنه قدیمی استفاده می‌کرد، حفظ کرد.
restored
دامنه پس از انجام بازیابی داده توسط کاربر تأیید شد. فرض بر این است که دامنه قبلاً تأیید شده است.
legacy_failure
دامنه توسط یک تأیید کننده قدیمی رد شد. دلیل خاص شکست ناشناخته است.
system_configured
دامنه به طور خودکار توسط پیکربندی دستگاه تأیید شد.
کد خطا 1024 یا بیشتر

کد خطای سفارشی که مخصوص تأییدکننده دستگاه است.

دوباره بررسی کنید که اتصال شبکه برقرار کرده اید و دوباره فرآیند تأیید دامنه را فراخوانی کنید .

از کاربر بخواهید برنامه شما را با دامنه مرتبط کند

راه دیگر برای تأیید برنامه شما برای دامنه این است که از کاربر بخواهید برنامه شما را با آن دامنه مرتبط کند.

بررسی کنید که آیا برنامه شما قبلاً برای دامنه تأیید شده است یا خیر

قبل از اینکه از کاربر درخواست کنید، بررسی کنید که آیا برنامه شما کنترل کننده پیش‌فرض دامنه‌هایی است که در عناصر <intent-filter> خود تعریف می‌کنید یا خیر. با استفاده از یکی از روش های زیر می توانید وضعیت تایید را پرس و جو کنید:

DomainVerificationManager

قطعه کد زیر نحوه استفاده از DomainVerificationManager API را نشان می دهد:

کاتلین

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

جاوا

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

برنامه خط فرمان

هنگام آزمایش برنامه خود در حین توسعه، می‌توانید دستور زیر را اجرا کنید تا وضعیت تأیید دامنه‌هایی که سازمان شما مالک آن است را پرس و جو کنید:

adb shell pm get-app-links --user cur PACKAGE_NAME

در خروجی مثال زیر، حتی اگر برنامه تأیید نشد برای دامنه «example.org»، کاربر 0 به صورت دستی برنامه را در تنظیمات سیستم تأیید کرده است و هیچ بسته دیگری برای آن دامنه تأیید نشده است.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

همچنین می‌توانید از دستورات پوسته برای شبیه‌سازی فرآیندی استفاده کنید که در آن کاربر انتخاب می‌کند کدام برنامه با یک دامنه خاص مرتبط است. توضیح کامل این دستورات از خروجی adb shell pm در دسترس است.

زمینه درخواست را فراهم کنید

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

درخواست را مطرح کنید

پس از اینکه کاربر متوجه شد برنامه شما از او چه می خواهد، درخواست را ارائه دهید. برای انجام این کار، همانطور که در قطعه کد زیر نشان داده شده است، یک intent را فراخوانی کنید که شامل کنش هدف ACTION_APP_OPEN_BY_DEFAULT_SETTINGS و یک package: com.example.pkg برای برنامه هدف:

کاتلین

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

جاوا

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

هنگامی که intent فراخوانی می شود، کاربران صفحه تنظیماتی را می بینند که به طور پیش فرض Open نامیده می شود. همانطور که در شکل 1 نشان داده شده است، این صفحه شامل یک دکمه رادیویی به نام پیوندهای پشتیبانی شده باز است.

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

هنگامی که دکمه رادیویی فعال است، بخشی نزدیک به پایین شامل چک باکس ها و همچنین دکمه ای به نام "افزودن پیوند" است.
شکل 1. صفحه تنظیمات سیستم که در آن کاربران می توانند انتخاب کنند کدام پیوندها به طور پیش فرض در برنامه شما باز می شوند.
هر چک باکس نشان دهنده دامنه ای است که می توانید اضافه کنید. دکمه های گفتگو عبارتند از «لغو» و «افزودن».
شکل 2. گفتگو که در آن کاربران می توانند دامنه های اضافی را برای مرتبط کردن با برنامه شما انتخاب کنند.

دامنه هایی را در برنامه خود باز کنید که برنامه شما نمی تواند آنها را تأیید کند

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

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

لینک های اپلیکیشن را تست کنید

هنگام اجرای ویژگی پیوند برنامه، باید عملکرد پیوند را آزمایش کنید تا مطمئن شوید که سیستم می تواند برنامه شما را با وب سایت های شما مرتبط کند و درخواست های URL را همانطور که انتظار دارید رسیدگی کند.

برای آزمایش یک فایل بیانیه موجود، می توانید از ابزار Statement List Generator and Tester استفاده کنید.

لیست میزبان ها را برای تأیید تأیید کنید

هنگام آزمایش، باید لیست میزبان های مرتبطی را که سیستم باید برای برنامه شما تأیید کند تأیید کنید. فهرستی از همه URLهایی که فیلترهای هدف مربوطه آنها شامل ویژگی ها و عناصر زیر است تهیه کنید:

  • ویژگی android:scheme با مقدار http یا https
  • ویژگی android:host با الگوی URL دامنه
  • عنصر اقدام android.intent.action.VIEW
  • عنصر دسته android.intent.category.BROWSABLE

از این لیست برای بررسی اینکه یک فایل JSON Links دارایی دیجیتال در هر میزبان و زیر دامنه نامگذاری شده ارائه شده است استفاده کنید.

فایل های Digital Asset Links را تایید کنید

برای هر وب سایت، از Digital Asset Links API استفاده کنید تا تأیید کنید که فایل JSON پیوندهای دارایی دیجیتال به درستی میزبانی و تعریف شده است:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

به عنوان بخشی از فرآیند آزمایش خود، می توانید تنظیمات فعلی سیستم را برای مدیریت پیوند بررسی کنید. از دستور زیر برای دریافت فهرستی از خط مشی های مدیریت پیوند موجود برای همه برنامه های دستگاه متصل خود استفاده کنید:

adb shell dumpsys package domain-preferred-apps

یا موارد زیر همین کار را می کند:

adb shell dumpsys package d

توجه: مطمئن شوید که حداقل 20 ثانیه پس از نصب برنامه خود منتظر بمانید تا به سیستم اجازه دهید فرآیند تأیید را کامل کند.

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

App linkages for user 0:

پس از این هدر، خروجی از فرمت زیر برای فهرست کردن تنظیمات مدیریت پیوند برای آن کاربر استفاده می کند:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

این فهرست نشان می‌دهد که کدام برنامه‌ها با کدام دامنه‌ها برای آن کاربر مرتبط هستند:

  • Package - برنامه را با نام بسته آن، همانطور که در مانیفست اعلام شده است، شناسایی می کند.
  • Domains - لیست کامل میزبان هایی را نشان می دهد که پیوندهای وب آنها این برنامه مدیریت می کند، با استفاده از فضاهای خالی به عنوان جداکننده.
  • Status - تنظیم فعلی مدیریت پیوند را برای این برنامه نشان می دهد. برنامه‌ای که تأیید را پشت سر گذاشته است و مانیفست آن حاوی android:autoVerify="true" ، وضعیت always را نشان می‌دهد. عدد هگزادسیمال بعد از این وضعیت مربوط به سابقه سیستم اندروید از تنظیمات برگزیده پیوند برنامه کاربر است. این مقدار نشان نمی دهد که آیا تأیید با موفقیت انجام شده است یا خیر.

توجه: اگر کاربری تنظیمات پیوند برنامه را برای یک برنامه قبل از تکمیل تأیید تغییر دهد، ممکن است یک تأیید کاذب برای تأیید موفقیت آمیز مشاهده کنید، حتی اگر تأیید صحت ناموفق باشد. با این حال، اگر کاربر صریحاً برنامه را فعال کرده باشد تا پیوندهای پشتیبانی شده را بدون درخواست باز کند، این شکست تأیید اهمیتی ندارد. این به این دلیل است که اولویت های کاربر بر تأیید برنامه ای (یا عدم وجود آن) اولویت دارد. در نتیجه، پیوند مستقیماً به برنامه شما می‌رود، بدون اینکه دیالوگی نشان داده شود، درست مثل اینکه تأیید تأیید شده است.

نمونه تست

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

<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>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.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="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

لیست میزبان هایی که پلتفرم سعی می کند از مانیفست بالا تأیید کند عبارتند از:

www.example.com
mobile.example.com
www.example2.com
account.example.com

لیست میزبان هایی که پلتفرم سعی نمی کند از مانیفست بالا تأیید کند عبارتند از:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

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

رفع خطاهای رایج پیاده سازی

اگر نمی توانید پیوندهای برنامه Android خود را تأیید کنید، خطاهای رایج زیر را بررسی کنید. این بخش از example.com به عنوان نام دامنه مکان‌دار استفاده می‌کند. هنگام انجام این بررسی ها، example.com با نام دامنه واقعی سرور خود جایگزین کنید.

فیلتر هدف نادرست تنظیم شده است
بررسی کنید که آیا نشانی اینترنتی را که برنامه شما متعلق به آن نیست در عنصر <intent-filter> وارد می‌کنید یا خیر.
پیکربندی سرور نادرست

پیکربندی JSON سرور خود را بررسی کنید و مطمئن شوید که مقدار SHA درست است.

همچنین آن example.com. (با دوره پایانی) همان محتوا را به عنوان example.com ارائه می دهد.

تغییر مسیرهای سمت سرور

اگر تغییر مسیری مانند موارد زیر را تنظیم کنید، سیستم هیچ پیوند برنامه Android را برای برنامه شما تأیید نمی کند:

  • http://example.com به https://example.com
  • example.com به www.example.com

این رفتار از امنیت برنامه شما محافظت می کند.

استحکام سرور

بررسی کنید که آیا سرور شما می تواند به برنامه های مشتری شما متصل شود یا خیر.

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

برای اهداف آزمایشی، ممکن است عمداً پیوندهای غیرقابل تأیید اضافه کنید. به خاطر داشته باشید که در اندروید 11 و پایین‌تر، این پیوندها باعث می‌شوند که سیستم تمام پیوندهای برنامه Android را برای برنامه شما تأیید نکند.

امضای نادرست در assetlinks.json

بررسی کنید که امضای شما صحیح است و با امضای مورد استفاده برای امضای برنامه شما مطابقت دارد. اشتباهات رایج عبارتند از:

  • امضای برنامه با گواهی اشکال زدایی و فقط داشتن امضای انتشار در assetlinks.json .
  • داشتن امضای کوچک در assetlinks.json . امضا باید با حروف بزرگ باشد.
  • اگر از Play App Signing استفاده می‌کنید، مطمئن شوید که از امضایی استفاده می‌کنید که Google برای امضای هر یک از نسخه‌های شما استفاده می‌کند. با دنبال کردن دستورالعمل‌های مربوط به اعلام ارتباط وب‌سایت، می‌توانید این جزئیات، از جمله یک قطعه کامل JSON را تأیید کنید.