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

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

تأیید خودکار

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

  1. سیستم تمام فیلترهای هدفی را که شامل موارد زیر هستند، بررسی می‌کند:
    • اقدام: android.intent.action.VIEW
    • دسته‌ها: android.intent.category.BROWSABLE و android.intent.category.DEFAULT
    • طرح داده: http یا https
  2. برای هر نام میزبان منحصر به فرد که در فیلترهای intent بالا یافت می‌شود، اندروید وب‌سایت‌های مربوطه را برای فایل Digital Asset Links در https:///.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"

تأیید دستی

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

ایجاد اتصال اینترنت

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

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

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

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

adb shell am compat enable 175408749 PACKAGE_NAME

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

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

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

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

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

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

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
دامنه به زور و معمولاً با اجرای یک دستور shell تأیید می‌شد.
denied
دامنه به زور و معمولاً با اجرای یک دستور shell مسدود شد.
migrated
این سیستم نتیجه‌ی فرآیند قبلی که از تأیید دامنه‌ی قدیمی استفاده می‌کرد را حفظ کرد.
restored
دامنه پس از انجام بازیابی اطلاعات توسط کاربر تأیید شد. فرض بر این است که دامنه قبلاً تأیید شده است.
legacy_failure
دامنه توسط یک تأییدکننده‌ی قدیمی رد شده است. دلیل خاص عدم موفقیت مشخص نیست.
system_configured
دامنه به طور خودکار توسط پیکربندی دستگاه تأیید شد.
کد خطای 1024 یا بیشتر

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

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

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

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

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

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

مدیر تأیید دامنه

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

کاتلین

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

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

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

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

درخواست را انجام دهید

بعد از اینکه کاربر متوجه شد برنامه شما از او چه می‌خواهد، درخواست را ارسال کنید. برای انجام این کار، یک اینتنت که شامل اکشن اینتنت 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);

وقتی اینتنت فراخوانی می‌شود، کاربران صفحه تنظیماتی به نام «باز کردن» (Open by default) را مشاهده می‌کنند. این صفحه شامل یک دکمه رادیویی به نام «باز کردن لینک‌های پشتیبانی‌شده» (Open supported links ) است، همانطور که در شکل ۱ نشان داده شده است.

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

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

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

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

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