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

وقتی 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:///.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. گفتگو که در آن کاربران می توانند دامنه های اضافی را برای مرتبط کردن با برنامه شما انتخاب کنند.

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

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

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