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