پیوند برنامه اندروید نوع خاصی از پیوند عمیق است که به URL های وب سایت شما اجازه می دهد بلافاصله محتوای مربوطه را در برنامه اندروید شما باز کنند، بدون اینکه کاربر مجبور شود برنامه را انتخاب کند. پیوندهای برنامه Android از Digital Asset Links API استفاده می کنند تا اطمینان حاصل کنند که برنامه شما توسط وب سایت تأیید شده است تا به طور خودکار پیوندها را برای آن دامنه باز کند. اگر سیستم با موفقیت تأیید کند که شما صاحب URL ها هستید، سیستم به طور خودکار آن اهداف URL را به برنامه شما هدایت می کند.
برای تأیید اینکه شما هم مالک برنامه و هم نشانی وب سایت هستید، مراحل زیر را انجام دهید:
فیلترهای intent را که حاوی ویژگی
autoVerify
هستند اضافه کنید. این ویژگی به سیستم سیگنال می دهد که باید بررسی کند که آیا برنامه شما به دامنه های URL استفاده شده در فیلترهای هدف شما تعلق دارد یا خیر.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 را نشان می دهد:
[{ "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
):
[{ "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-typeapplication/json
ارائه می شود. - فایل
assetlinks.json
باید از طریق اتصال HTTPS قابل دسترسی باشد، صرف نظر از اینکه فیلترهای هدف برنامه شما HTTPS را به عنوان طرح داده اعلام میکنند یا خیر. - فایل
assetlinks.json
باید بدون هیچ تغییر مسیری قابل دسترسی باشد (بدون تغییر مسیر 301 یا 302). - اگر پیوندهای برنامه شما از چندین دامنه میزبان پشتیبانی می کند، باید فایل
assetlinks.json
را در هر دامنه منتشر کنید. به پشتیبانی از پیوند برنامه برای چندین میزبان مراجعه کنید. - برنامه خود را با نشانیهای وب برنامهنویس/آزمایش در فایل مانیفست که ممکن است برای عموم قابل دسترسی نباشد منتشر نکنید (مانند مواردی که فقط با VPN قابل دسترسی هستند). راه حل در چنین مواردی، پیکربندی انواع ساخت برای ایجاد یک فایل مانیفست متفاوت برای ساختهای توسعهدهنده است.
تأیید پیوندهای برنامه Android
هنگامی که 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:// 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
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 نشان داده شده است، همچنین میتوانند افزودن پیوند را برای افزودن دامنهها انتخاب کنند. وقتی کاربران بعداً پیوندی را در دامنههایی که اضافه میکنند انتخاب کنند، پیوند به طور خودکار در برنامه شما باز میشود.
دامنه هایی را در برنامه خود باز کنید که برنامه شما نمی تواند آنها را تأیید کند
عملکرد اصلی برنامه شما ممکن است این باشد که پیوندها را به عنوان شخص ثالث باز کند، بدون اینکه امکان تأیید دامنه های کنترل شده آن وجود نداشته باشد. اگر چنین است، به کاربران توضیح دهید که در آن زمان که پیوند وب را انتخاب می کنند، نمی توانند بین یک برنامه شخص اول و برنامه (شخص ثالث) شما یکی را انتخاب کنند. کاربران باید دامنه ها را به صورت دستی با برنامه شخص ثالث شما مرتبط کنند.
علاوه بر این، یک فعالیت گفتگو یا ترامپولین را در نظر بگیرید که به کاربر اجازه میدهد در صورت تمایل کاربر، پیوند را در برنامه شخص اول باز کند و به عنوان یک پروکسی عمل کند. قبل از تنظیم چنین گفتگو یا فعالیت ترامپلاین، برنامه خود را طوری تنظیم کنید که بسته را در برنامه های شخص اول که با فیلتر هدف وب برنامه شما مطابقت دارند، قابل مشاهده باشد.
لینک های اپلیکیشن را تست کنید
هنگام اجرای ویژگی پیوند برنامه، باید عملکرد پیوند را آزمایش کنید تا مطمئن شوید که سیستم می تواند برنامه شما را با وب سایت های شما مرتبط کند و درخواست های 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 را تأیید کنید.
- امضای برنامه با گواهی اشکال زدایی و فقط داشتن امضای انتشار در
پیوند برنامه اندروید نوع خاصی از پیوند عمیق است که به URL های وب سایت شما اجازه می دهد بلافاصله محتوای مربوطه را در برنامه اندروید شما باز کنند، بدون اینکه کاربر مجبور شود برنامه را انتخاب کند. پیوندهای برنامه Android از Digital Asset Links API استفاده می کنند تا اطمینان حاصل کنند که برنامه شما توسط وب سایت تأیید شده است تا به طور خودکار پیوندها را برای آن دامنه باز کند. اگر سیستم با موفقیت تأیید کند که شما صاحب URL ها هستید، سیستم به طور خودکار آن اهداف URL را به برنامه شما هدایت می کند.
برای تأیید اینکه شما هم مالک برنامه و هم نشانی وب سایت هستید، مراحل زیر را انجام دهید:
فیلترهای intent را که حاوی ویژگی
autoVerify
هستند اضافه کنید. این ویژگی به سیستم سیگنال می دهد که باید بررسی کند که آیا برنامه شما به دامنه های URL استفاده شده در فیلترهای هدف شما تعلق دارد یا خیر.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 را نشان می دهد:
[{ "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
):
[{ "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-typeapplication/json
ارائه می شود. - فایل
assetlinks.json
باید از طریق اتصال HTTPS قابل دسترسی باشد، صرف نظر از اینکه فیلترهای هدف برنامه شما HTTPS را به عنوان طرح داده اعلام میکنند یا خیر. - فایل
assetlinks.json
باید بدون هیچ تغییر مسیری قابل دسترسی باشد (بدون تغییر مسیر 301 یا 302). - اگر پیوندهای برنامه شما از چندین دامنه میزبان پشتیبانی می کند، باید فایل
assetlinks.json
را در هر دامنه منتشر کنید. به پشتیبانی از پیوند برنامه برای چندین میزبان مراجعه کنید. - برنامه خود را با URL های Dev/Test در پرونده مانیفست که ممکن است در دسترس عموم نباشد (مانند هر چیزی که فقط با VPN قابل دسترسی باشد) منتشر نکنید. کار در چنین مواردی پیکربندی انواع ساخت و ساز برای تولید یک فایل آشکار متفاوت برای ساختهای Dev است.
پیوندهای برنامه Android پیوندهای تأیید
هنگامی که android:autoVerify="true"
حداقل در یکی از فیلترهای قصد برنامه شما وجود دارد ، نصب برنامه خود را بر روی دستگاهی که Android 6.0 (API سطح 23) را اجرا می کند ، باعث می شود که سیستم به طور خودکار میزبان های مرتبط با URL ها را تأیید کند فیلترهای قصد برنامه شما در Android 12 و بالاتر ، شما همچنین می توانید برای آزمایش منطق تأیید ، از فرآیند تأیید استفاده کنید .
تأیید خودکار
تأیید خودکار سیستم شامل موارد زیر است:
- این سیستم تمام فیلترهای قصد را شامل می شود که شامل هر یک از موارد زیر است:
- عمل:
android.intent.action.VIEW
- دسته بندی ها:
android.intent.category.BROWSABLE
وandroid.intent.category.DEFAULT
- طرح داده:
http
یاhttps
- عمل:
- برای هر نام میزبان منحصر به فرد موجود در فیلترهای هدف فوق ، 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"
تایید دستی
با شروع در Android 12 ، می توانید به صورت دستی از تأیید دامنه برای برنامه ای که روی یک دستگاه نصب شده است استفاده کنید. شما می توانید بدون توجه به اینکه برنامه شما Android 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
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
در مثال زیر خروجی ، حتی اگر برنامه برای دامنه "مثال. 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
در دسترس است.
زمینه ای را برای درخواست فراهم کنید
قبل از اینکه این درخواست را برای تأیید دامنه انجام دهید ، زمینه ای را برای کاربر فراهم کنید. به عنوان مثال ، ممکن است شما یک صفحه نمایش چلپ چلوپ ، یک گفتگو یا یک عنصر UI مشابه را به آنها نشان دهید که به کاربر توضیح می دهد که چرا برنامه شما باید کنترل کننده پیش فرض برای یک دامنه خاص باشد.
درخواست را مطرح کنید
بعد از اینکه کاربر می فهمد برنامه شما از آنها چه کاری می خواهد انجام دهند ، درخواست را انجام دهید. برای انجام این کار ، از هدفی استفاده کنید که شامل عمل هدف 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);
هنگامی که این هدف فراخوانی می شود ، کاربران صفحه تنظیمات را به نام باز به طور پیش فرض می بینند. این صفحه حاوی یک دکمه رادیویی به نام پیوندهای پشتیبانی شده باز است ، همانطور که در شکل 1 نشان داده شده است.
هنگامی که کاربر پیوندهای پشتیبانی شده باز را روشن می کند ، مجموعه ای از کادر انتخاب در زیر بخشی به نام پیوندها برای باز کردن در این برنامه ظاهر می شود. از اینجا ، کاربران می توانند دامنه هایی را که می خواهند با برنامه شما ارتباط برقرار کنند ، انتخاب کنند. آنها همچنین می توانند Add Link را برای افزودن دامنه ها انتخاب کنند ، همانطور که در شکل 2 نشان داده شده است. وقتی کاربران بعداً هر پیوندی را در دامنه هایی که اضافه می کنند انتخاب می کنند ، پیوند در برنامه شما به طور خودکار باز می شود.
دامنه ها را در برنامه خود باز کنید که برنامه شما نتواند تأیید کند
عملکرد اصلی برنامه شما ممکن است باز کردن پیوندها به عنوان شخص ثالث ، بدون توانایی تأیید دامنه های اداره شده آن باشد. اگر این مورد است ، برای کاربران توضیح دهید که در آن زمان که آنها یک لینک وب را انتخاب می کنند ، آنها نمی توانند بین یک برنامه شخص اول و برنامه (شخص ثالث) شما را انتخاب کنند. کاربران باید دامنه ها را با برنامه شخص ثالث خود به صورت دستی مرتبط کنند.
علاوه بر این ، در نظر بگیرید که یک گفتگو یا فعالیت ترامپولین را معرفی کنید که به کاربر اجازه می دهد اگر کاربر ترجیح دهد این کار را انجام دهد ، پیوند را در برنامه شخص اول باز کند ، به عنوان یک پروکسی عمل کند. قبل از تنظیم چنین گفتگوی یا فعالیت ترامپولین ، برنامه خود را طوری تنظیم کنید که در برنامه های شخص اول که مطابق با فیلتر هدف وب برنامه شما هستند ، دید بسته باشد.
پیوندهای برنامه آزمایشی
هنگام اجرای ویژگی پیوند برنامه ، باید عملکرد پیوند را آزمایش کنید تا مطمئن شوید که سیستم می تواند برنامه شما را با وب سایت های خود مرتبط کند و همانطور که انتظار دارید ، درخواست های URL را کنترل کنید.
برای آزمایش یک فایل بیانیه موجود ، می توانید از Generator List List و Tester Tool استفاده کنید.
لیست میزبان ها را برای تأیید تأیید کنید
هنگام آزمایش ، باید لیست میزبان های مرتبط را تأیید کنید که سیستم باید برنامه شما را تأیید کند. لیستی از تمام URL هایی که فیلترهای هدف مربوطه آنها شامل ویژگی ها و عناصر زیر است ، تهیه کنید:
-
android:scheme
با مقدارhttp
یاhttps
-
android:host
با الگوی URL دامنه -
android.intent.action.VIEW
Element Action -
android.intent.category.BROWSABLE
Element
از این لیست استفاده کنید تا بررسی کنید که یک پرونده JSON دارایی دیجیتال در هر میزبان و زیر دامنه نامگذاری شده ارائه شده است.
فایلهای پیوند دیجیتال را تأیید کنید
برای هر وب سایت ، از API Links Digital Asset Links استفاده کنید تا تأیید کنید که پرونده 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
با نام دامنه واقعی سرور خود جایگزین کنید.
- فیلتر هدف نادرست تنظیم شده است
- بررسی کنید که آیا شما یک URL را که برنامه شما در یک عنصر
<intent-filter>
در اختیار شما نیست ، درج کنید. - پیکربندی سرور نادرست
پیکربندی JSON سرور خود را بررسی کنید و مطمئن شوید که مقدار SHA صحیح است.
همچنین ، آن
example.com.
(با دوره دنباله دار) همان محتوا را به عنوانexample.com
خدمت می کند.- تغییر مسیر سمت سرور
در صورت تنظیم تغییر مسیر مانند موارد زیر ، سیستم هیچ پیوندی برنامه Android را برای برنامه شما تأیید نمی کند:
-
http://example.com
بهhttps://example.com
-
example.com
بهwww.example.com
این رفتار از امنیت برنامه شما محافظت می کند.
-
- استحناء سرور
بررسی کنید که آیا سرور شما می تواند به برنامه های مشتری شما متصل شود.
- پیوندهای غیر قابل تأیید
برای اهداف آزمایش ، ممکن است عمداً پیوندهای غیر قابل تأیید اضافه کنید. به خاطر داشته باشید که ، در Android 11 و پایین ، این پیوندها باعث می شوند که سیستم تمام پیوندهای برنامه Android را برای برنامه شما تأیید نکند.
- امضای نادرست در Assetlinks.Json
تأیید کنید که امضای شما صحیح است و با امضای مورد استفاده برای امضای برنامه شما مطابقت دارد. اشتباهات رایج شامل موارد زیر است:
- امضای برنامه با یک گواهی اشکال زدایی و تنها امضای انتشار در
assetlinks.json
. - داشتن امضای مورد پایین در
assetlinks.json
. امضای باید در مورد بزرگ باشد. - اگر از امضای برنامه Play استفاده می کنید ، حتما از امضایی که Google برای امضای هر یک از نسخه های شما استفاده می کند ، استفاده می کنید. شما می توانید با پیروی از دستورالعمل های مربوط به اعلام انجمن های وب سایت ، این جزئیات ، از جمله یک قطعه کامل JSON را تأیید کنید.
- امضای برنامه با یک گواهی اشکال زدایی و تنها امضای انتشار در