ऐप्लिकेशन लिंक की जांच करना

ऐप्लिकेशन लिंक करने की सुविधा लागू करते समय, आपको लिंक करने की सुविधा की जांच करनी चाहिए. इससे यह पक्का किया जा सकेगा कि सिस्टम आपके ऐप्लिकेशन को आपकी वेबसाइटों से जोड़ सकता है. साथ ही, आपकी उम्मीद के मुताबिक यूआरएल के अनुरोधों को मैनेज कर सकता है.

किसी मौजूदा स्टेटमेंट फ़ाइल की जांच करने के लिए, स्टेटमेंट लिस्ट जनरेटर और टेस्टर टूल का इस्तेमाल किया जा सकता है.

यहां दिए गए सेक्शन में, ऐप्लिकेशन लिंक की पुष्टि करने की सुविधा को मैन्युअल तरीके से टेस्ट करने का तरीका बताया गया है. अगर आपको पुष्टि करने की प्रोसेस की जांच करनी है, तो Play के डीप लिंक टूल या Android Studio के ऐप लिंक असिस्टेंट का इस्तेमाल करें.

पुष्टि करने के लिए, होस्ट की सूची की पुष्टि करना

जांच करते समय, आपको उन होस्ट की सूची की पुष्टि करनी चाहिए जिनकी पुष्टि सिस्टम को आपके ऐप्लिकेशन के लिए करनी चाहिए. उन सभी यूआरएल की सूची बनाएं जिनके इंटेंट फ़िल्टर में ये एट्रिब्यूट और एलिमेंट शामिल हों:

  • android:scheme एट्रिब्यूट की वैल्यू http या https होनी चाहिए
  • android:host एट्रिब्यूट की वैल्यू के तौर पर, डोमेन यूआरएल पैटर्न सबमिट किया गया हो
  • android.intent.action.VIEW ऐक्शन एलिमेंट
  • android.intent.category.BROWSABLE कैटगरी एलिमेंट

इस सूची का इस्तेमाल करके देखें कि हर होस्ट और सबडोमेन के लिए, डिजिटल ऐसेट लिंक JSON फ़ाइल उपलब्ध कराई गई है या नहीं.

डिजिटल ऐसेट लिंक फ़ाइलों की पुष्टि करना

हर वेबसाइट के लिए, डिजिटल ऐसेट लिंक एपीआई का इस्तेमाल करके पुष्टि करें कि डिजिटल ऐसेट लिंक 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 दिखती है. इस स्टेटस के बाद मौजूद हेक्साडेसिमल नंबर, Android सिस्टम के उस रिकॉर्ड से जुड़ा होता है जिसमें उपयोगकर्ता की ऐप्लिकेशन लिंकेज की सेटिंग की जानकारी होती है. इस वैल्यू से यह पता नहीं चलता कि पुष्टि हुई है या नहीं.

टेस्ट का उदाहरण

ऐप्लिकेशन लिंक की पुष्टि करने के लिए, सिस्टम को आपके ऐप्लिकेशन की पुष्टि उन सभी वेबसाइटों के साथ करनी होगी जो आपने किसी ऐसे इंटेंट फ़िल्टर में बताई हैं जो ऐप्लिकेशन लिंक की ज़रूरी शर्तों को पूरा करता है. यहां दिए गए उदाहरण में, मेनिफ़ेस्ट कॉन्फ़िगरेशन दिखाया गया है. इसमें कई ऐप्लिकेशन लिंक तय किए गए हैं:

<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 17 से, ऐक्टिविटी मैनेजर (am start) कमांड के साथ --debug-link फ़्लैग का इस्तेमाल किया जा सकता है. इससे यह पता लगाया जा सकता है कि सिस्टम किसी यूआरएल को कैसे रिज़ॉल्व करता है. यह टूल, इंटेंट से मैच होने वाले ऐप्लिकेशन की पूरी जानकारी देता है. साथ ही, ऐप्लिकेशन मेनिफ़ेस्ट और assetlinks.json फ़ाइल (डाइनैमिक ऐप्लिकेशन लिंक के लिए) के उन खास नियमों की जानकारी देता है जिनका आकलन, समस्या हल करने के दौरान किया गया था.

किसी यूआरएल के लिए लिंक रिज़ॉल्यूशन की जांच करने के लिए, टर्मिनल विंडो में यह कमांड चलाएं:

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

डाइग्नोस्टिक आउटपुट, हेडर App Link Resolution Debug के नीचे प्रिंट होता है. इसमें ये सेक्शन शामिल होते हैं, ताकि आपको समस्या हल करने की प्रोसेस को समझने में मदद मिल सके:

  • टारगेट की जानकारी: यह पैकेज के नाम और टारगेट गतिविधि के हिसाब से, मैच होने वाले हर ऐप्लिकेशन की पहचान करता है.
  • इंटेंट फ़िल्टर मैच (AndroidManifest.xml): इससे पता चलता है कि मेनिफ़ेस्ट इंटेंट फ़िल्टर में मौजूद कौनसे स्टैटिक एट्रिब्यूट, यूआरआई से मैच करते हैं. जैसे, scheme, host, path, pathPrefix या pathPattern.
  • ऐप्लिकेशन लिंक की पुष्टि: इससे डोमेन की पुष्टि की मौजूदा स्थिति दिखती है. जैसे, STATE_SUCCESS.
  • डाइनैमिक ऐप्लिकेशन लिंक: अगर ऐप्लिकेशन अपनी assetlinks.json फ़ाइल में, डाइनैमिक ऐप्लिकेशन लिंक से मैच करने वाले नियमों का इस्तेमाल करता है, तो इस सेक्शन में यूआरआई के हिसाब से जांचे गए हर नियम की सूची होती है. हर नियम में, मैच होने वाले यूआरआई फ़िल्टर (जैसे, पाथ प्रीफ़िक्स या पैटर्न) और allow फ़ील्ड की जानकारी होती है:
    • allow = 0: अनुमति देने/शामिल करने का नियम (allow: true). अगर यह नियम मैच होता है, तो ऐप्लिकेशन को यूआरआई खोलने की अनुमति मिल जाती है.
    • allow = 1: ब्लॉक करने/शामिल न करने का नियम (allow: false / exclude: true). अगर यह नियम मैच होता है, तो ऐप्लिकेशन को यूआरआई खोलने से रोक दिया जाता है.
    • ध्यान दें: खाली फ़िल्टर स्ट्रिंग (filter =) का मतलब है कि पाथ प्रीफ़िक्स खाली है. यह डोमेन के सभी पाथ से मैच करता है. यह वाइल्डकार्ड या कैच-ऑल के तौर पर काम करता है.

डीबग आउटपुट का उदाहरण

मान लें कि डोमेन https://xyz.com से जुड़ा कोई ऐप्लिकेशन (com.example.xyzapp) है, जो अपनी 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},
          {"/": "*"}
        ]
      }
    }
  }
]

--debug-link का इस्तेमाल करके, यूआरएल https://xyz.com/foo की जांच करते समय:

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 }

इस उदाहरण में, सिस्टम ने assetlinks.json से डाइनैमिक ऐप्लिकेशन लिंक के दो नियमों का आकलन किया:

  • नियम 0 (allow = 1, filter = /foo): {"/": "/foo*", "exclude": true} से जनरेट किया गया, यह यूआरएल को शामिल न करने का नियम (allow: false) है. यह /foo पाथ प्रीफ़िक्स से शुरू होने वाले यूआरएल को ब्लॉक करता है.
  • नियम 1 (allow = 0, filter =): इसे {"/": "*"} से जनरेट किया गया है. यह शामिल करने का नियम (allow: true) है, जिसमें पाथ प्रीफ़िक्स (filter =) खाली है. यह xyz.com के तहत आने वाले सभी पाथ से मैच करता है (कैच-ऑल).

इस मामले में समस्या को हल करने का तरीका:

  1. नियम 0 और नियम 1, दोनों यूआरएल https://xyz.com/foo से मैच करते हैं.
  2. डाइनैमिक ऐप्लिकेशन लिंक के नियमों का आकलन, ऊपर से नीचे की ओर क्रम से किया जाता है. सबसे पहले मैच होने वाला नियम लागू होता है.
  3. स्टेटमेंट की सूची में नियम 0 सबसे पहले दिखता है और यह सेटिंग से बाहर रखने का नियम (allow = 1) है. इसलिए, इसे अनुमति देने के सामान्य नियम (नियम 1) से ज़्यादा प्राथमिकता मिलती है.
  4. इसलिए, ऐप्लिकेशन को https://xyz.com/foo को हैंडल करने से बाहर रखा गया है. इससे सिस्टम, ब्राउज़र पर वापस चला जाता है या साफ़ तौर पर जानकारी देने वाला डायलॉग दिखाता है.