وقتی android:autoVerify="true"
حداقل در یکی از فیلترهای هدف برنامه شما وجود دارد، نصب برنامه شما روی دستگاهی که دارای Android نسخه 6.0 (سطح API 23) یا بالاتر است، باعث میشود سیستم به طور خودکار میزبانهای مرتبط با URLهای موجود در فیلترهای هدف برنامه شما را تأیید کند. در اندروید 12 و بالاتر، میتوانید فرآیند تأیید را به صورت دستی برای آزمایش منطق تأیید فراخوانی کنید .
تأیید خودکار
تأیید خودکار سیستم شامل موارد زیر است:
- سیستم تمام فیلترهای هدف را که شامل هر یک از موارد زیر است بررسی می کند:
- اکشن:
android.intent.action.VIEW
- دستهها:
android.intent.category.BROWSABLE
وandroid.intent.category.DEFAULT
- طرح داده:
http
یاhttps
- اکشن:
- برای هر نام میزبان منحصربهفردی که در فیلترهای هدف بالا یافت میشود، 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
API (در زمان اجرا). - یک برنامه خط فرمان (در حین آزمایش).
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 نشان داده شده است، همچنین میتوانند افزودن پیوند را برای افزودن دامنهها انتخاب کنند. وقتی کاربران بعداً پیوندی را در دامنههایی که اضافه میکنند انتخاب کنند، پیوند به طور خودکار در برنامه شما باز میشود.
دامنه هایی را در برنامه خود باز کنید که برنامه شما نمی تواند آنها را تأیید کند
عملکرد اصلی برنامه شما ممکن است این باشد که پیوندها را به عنوان شخص ثالث باز کند، بدون اینکه امکان تأیید دامنه های کنترل شده آن وجود نداشته باشد. اگر چنین است، به کاربران توضیح دهید که در آن زمان که پیوند وب را انتخاب می کنند، نمی توانند بین یک برنامه شخص اول و برنامه (شخص ثالث) شما یکی را انتخاب کنند. کاربران باید دامنه ها را به صورت دستی با برنامه شخص ثالث شما مرتبط کنند.
علاوه بر این، یک فعالیت گفتگو یا ترامپولین را در نظر بگیرید که به کاربر اجازه میدهد در صورت تمایل کاربر، پیوند را در برنامه شخص اول باز کند و به عنوان یک پروکسی عمل کند. قبل از تنظیم چنین گفتگو یا فعالیت ترامپلاین، برنامه خود را طوری تنظیم کنید که بسته را در برنامه های شخص اول که با فیلتر هدف وب برنامه شما مطابقت دارند، قابل مشاهده باشد.