لینک های اپلیکیشن را تست کنید

هنگام پیاده‌سازی ویژگی پیوند برنامه، باید عملکرد پیوند را آزمایش کنید تا مطمئن شوید سیستم می‌تواند برنامه شما را با وب‌سایت‌هایتان مرتبط کند و درخواست‌های URL را همانطور که انتظار دارید، مدیریت کند.

برای آزمایش یک فایل دستور موجود، می‌توانید از ابزار تولیدکننده و آزمایشگر لیست دستور استفاده کنید.

بخش‌های زیر نحوه‌ی آزمایش دستی تأیید App Links را شرح می‌دهند. در صورت تمایل، می‌توانید تأیید را از ابزار Play Deep Links یا Android Studio App Links Assistant آزمایش کنید.

لیست میزبان‌ها را برای بررسی تأیید کنید

هنگام آزمایش، باید لیست میزبان‌های مرتبطی را که سیستم باید برای برنامه شما تأیید کند، تأیید کنید. لیستی از تمام URLهایی که فیلترهای intent مربوطه آنها شامل ویژگی‌ها و عناصر زیر است، تهیه کنید:

  • ویژگی android:scheme با مقدار http یا https
  • ویژگی android:host با الگوی URL دامنه
  • عنصر اکشن android.intent.action.VIEW
  • عنصر دسته بندی android.intent.category.BROWSABLE

از این لیست برای بررسی وجود فایل JSON پیوندهای دارایی‌های دیجیتال در هر میزبان و زیردامنه نامگذاری شده استفاده کنید.

فایل‌های پیوندهای دارایی دیجیتال را تأیید کنید

برای هر وب‌سایت، از API پیوندهای دارایی دیجیتال استفاده کنید تا تأیید کنید که فایل JSON پیوندهای دارایی دیجیتال به درستی میزبانی و تعریف شده است:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://<var>domain.name</var>:<var>optional_port</var>&amp;
   relation=delegate_permission/common.handle_all_urls

برای لینک‌های پویای برنامه، می‌توانید افزونه‌های رابطه را نیز بررسی کنید.

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://www.example.com&relation=delegate_permission/common.handle_all_urls&return_relation_extensions=true

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

adb shell dumpsys package domain-preferred-apps

دستور زیر هم همین کار را انجام می‌دهد:

adb shell dumpsys package d

این دستور فهرستی از هر کاربر یا پروفایل تعریف‌شده روی دستگاه را برمی‌گرداند که قبل از آن یک سرآیند با فرمت زیر قرار دارد:

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 را نشان می‌دهد. عدد هگزادسیمال بعد از این وضعیت مربوط به رکورد سیستم اندروید از تنظیمات پیوند برنامه کاربر است. این مقدار نشان نمی‌دهد که آیا تأیید موفقیت‌آمیز بوده است یا خیر.

مثال آزمایشی

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

<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)

برای کسب اطلاعات بیشتر در مورد لیست‌های بیانیه، به ایجاد لیست بیانیه مراجعه کنید.

از اندروید ۱۷ به بعد، می‌توانید از پرچم --debug-link به همراه دستور activity manager ( am start ) برای تشخیص نحوه‌ی پردازش یک URL خاص توسط سیستم استفاده کنید. این ابزار، جزئیات دقیقی از برنامه‌های کاندید که با هدف مورد نظر مطابقت دارند، به همراه قوانین خاص از مانیفست برنامه و فایل assetlinks.json (برای لینک‌های پویای برنامه) که در طول پردازش ارزیابی شده‌اند، ارائه می‌دهد.

برای آزمایش وضوح لینک برای یک URL خاص، دستور زیر را در یک پنجره ترمینال اجرا کنید:

adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"

خروجی تشخیصی زیر عنوان App Link Resolution Debug چاپ می‌شود و شامل بخش‌های زیر است تا به شما در درک فرآیند حل مشکل کمک کند:

  • جزئیات هدف: هر برنامه کاندید منطبق را با نام بسته و فعالیت هدف آن شناسایی می‌کند.
  • تطابق فیلتر Intent ( AndroidManifest.xml ): نشان می‌دهد که کدام ویژگی‌های استاتیک در فیلتر intent مانیفست (مانند scheme ، host ، path ، pathPrefix یا pathPattern ) با URI مطابقت دارند.
  • تأیید پیوند برنامه: وضعیت تأیید دامنه فعلی (مانند STATE_SUCCESS ) را نشان می‌دهد.
  • پیوندهای پویای برنامه: اگر برنامه از قوانین تطبیق پیوندهای پویای برنامه در فایل assetlinks.json خود استفاده کند، این بخش هر قانونی را که در برابر URI ارزیابی شده است، فهرست می‌کند. هر قانون، فیلترهای URI تطبیق یافته (مانند پیشوندهای مسیر یا الگوها) و یک فیلد allow نشان می‌دهد:
    • allow = 0 : یک قانون اجازه/گنجاندن ( allow: true ). اگر این قانون مطابقت داشته باشد، برنامه مجاز به باز کردن URI است.
    • allow = 1 : یک قانون انسداد/حذف ( allow: false / exclude: true ). اگر این قانون مطابقت داشته باشد، برنامه از باز کردن URI جلوگیری می‌کند.
    • نکته : یک رشته فیلتر خالی ( filter = ) نشان‌دهنده یک پیشوند مسیر خالی است که با تمام مسیرهای تحت دامنه مطابقت دارد (به عنوان یک wildcard یا catch-all عمل می‌کند).

مثال خروجی اشکال‌زدایی

یک برنامه ( com.example.xyzapp ) مرتبط با دامنه https://xyz.com را در نظر بگیرید که قوانین پویایی را در فایل assetlinks.json خود تعریف می‌کند تا /foo* را حذف کند و به همه مسیرهای دیگر اجازه دسترسی بدهد:

[
  {
    "relation": [
      "delegate_permission/common.handle_all_urls"
    ],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.xyzapp",
      "sha256_cert_fingerprints": ["..."]
    },
    "relation_extensions": {
      "delegate_permission/common.handle_all_urls": {
        "dynamic_app_link_components": [
          {"/": "/foo*", "exclude": true},
          {"/": "*"}
        ]
      }
    }
  }
]

هنگام عیب‌یابی URL https://xyz.com/foo با استفاده از --debug-link :

adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"

این دستور، تجزیه و تحلیل تشخیصی زیر را ارائه می‌دهد:

--- App Link Resolution Debug ---

URI: https://xyz.com/foo
Resolution: Ambiguous (Multiple apps or Browser fallback)
This usually happens when multiple apps can handle the link and no default is set.

All Matching Candidates:

Target:
  Package: com.example.xyzapp
  Activity: com.example.xyzapp.MainActivity

  Intent Filter Match (AndroidManifest.xml)
    Scheme: 'https' matched android:scheme="https"
    Host: 'xyz.com' matched android:host="xyz.com"

App Link Verification:
  Verification status: STATE_SUCCESS
  Dynamic App Links:
    -> Matched Rule 0: UriRelativeFilterGroup { allow = 1, uri_filters = {UriRelativeFilter { uriPart = PATH, patternType = PREFIX, filter = /foo }},  }
    -> Matched Rule 1: UriRelativeFilterGroup { allow = 0, uri_filters = {UriRelativeFilter { uriPart = PATH, patternType = PREFIX, filter =  }},  }

Target:
  Package: org.chromium.webview_shell
  Activity: org.chromium.webview_shell.WebViewBrowserActivity

  Intent Filter Match (AndroidManifest.xml)
    Scheme: 'https' matched android:scheme="https"

---------------------------------

Starting: Intent { act=android.intent.action.VIEW dat=https://xyz.com/foo }

در این مثال، سیستم دو قانون Dynamic App Link را از assetlinks.json ارزیابی کرد:

  • قانون ۰ ( allow = 1 ، filter = /foo ): تولید شده از {"/": "/foo*", "exclude": true} ، این یک قانون استثنا ( allow: false ) است که URLهایی را که با پیشوند مسیر /foo شروع می‌شوند، مسدود می‌کند.
  • قانون ۱ ( allow = 0 ، filter = ): تولید شده از {"/": "*"} ، این یک قانون شمول ( allow: true ) با پیشوند مسیر خالی ( filter = ) است که با تمام مسیرهای زیر xyz.com مطابقت دارد (catch-all).

نحوه عملکرد وضوح تصویر در این سناریو:

  1. هر دو قانون ۰ و ۱ با URL https://xyz.com/foo مطابقت دارند.
  2. قوانین پیوند پویای برنامه به ترتیب متوالی از بالا به پایین ارزیابی می‌شوند (اولین قانون منطبق برنده می‌شود).
  3. از آنجا که قانون ۰ ابتدا در لیست دستورات ظاهر می‌شود و یک قانون استثنا ( allow = 1 ) است، بر قانون کلی allow ( قانون ۱ ) اولویت دارد.
  4. بنابراین، برنامه از مدیریت https://xyz.com/foo مستثنی می‌شود و باعث می‌شود سیستم به مرورگر برگردد یا یک کادر محاوره‌ای ابهام‌زدایی نمایش دهد.