পরীক্ষা অ্যাপ লিঙ্ক

অ্যাপ লিঙ্কিং ফিচারটি প্রয়োগ করার সময়, লিঙ্কিং কার্যকারিতাটি পরীক্ষা করে দেখা উচিত যাতে নিশ্চিত হওয়া যায় যে সিস্টেমটি আপনার অ্যাপকে আপনার ওয়েবসাইটগুলির সাথে যুক্ত করতে এবং আপনার প্রত্যাশা অনুযায়ী URL অনুরোধগুলি পরিচালনা করতে পারছে।

বিদ্যমান কোনো স্টেটমেন্ট ফাইল পরীক্ষা করার জন্য, আপনি স্টেটমেন্ট লিস্ট জেনারেটর এবং টেস্টার টুলটি ব্যবহার করতে পারেন।

নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে কীভাবে ম্যানুয়ালি আপনার অ্যাপ লিঙ্ক যাচাইকরণ পরীক্ষা করবেন। আপনি চাইলে, প্লে ডিপ লিঙ্কস টুল অথবা অ্যান্ড্রয়েড স্টুডিও অ্যাপ লিঙ্কস অ্যাসিস্ট্যান্ট থেকেও যাচাইকরণ পরীক্ষা করতে পারেন।

যাচাই করার জন্য হোস্টদের তালিকাটি নিশ্চিত করুন।

টেস্টিং করার সময়, আপনার অ্যাপের জন্য সিস্টেম যে সংশ্লিষ্ট হোস্টগুলো যাচাই করবে, তার তালিকাটি নিশ্চিত করে নিন। এমন সমস্ত URL-এর একটি তালিকা তৈরি করুন, যাদের সংশ্লিষ্ট ইন্টেন্ট ফিল্টারগুলোতে নিম্নলিখিত অ্যাট্রিবিউট এবং এলিমেন্টগুলো অন্তর্ভুক্ত রয়েছে:

  • android:scheme অ্যাট্রিবিউটের মান http বা https
  • ডোমেইন ইউআরএল প্যাটার্নের সাথে android:host অ্যাট্রিবিউট
  • android.intent.action.VIEW অ্যাকশন এলিমেন্ট
  • android.intent.category.BROWSABLE ক্যাটাগরি এলিমেন্ট

এই তালিকাটি ব্যবহার করে যাচাই করুন যে প্রতিটি নামযুক্ত হোস্ট এবং সাবডোমেইনে একটি ডিজিটাল অ্যাসেট লিঙ্কস JSON ফাইল সরবরাহ করা হয়েছে কিনা।

ডিজিটাল অ্যাসেট লিঙ্ক ফাইলগুলি নিশ্চিত করুন

প্রতিটি ওয়েবসাইটের জন্য, ডিজিটাল অ্যাসেট লিঙ্কস JSON ফাইলটি সঠিকভাবে হোস্ট এবং সংজ্ঞায়িত করা হয়েছে কিনা তা নিশ্চিত করতে ডিজিটাল অ্যাসেট লিঙ্কস API ব্যবহার করুন:

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 ' দেখায়। এই স্ট্যাটাসের পরের হেক্সাডেসিমাল সংখ্যাটি ব্যবহারকারীর অ্যাপ লিঙ্কেজ পছন্দের বিষয়ে অ্যান্ড্রয়েড সিস্টেমের রেকর্ডের সাথে সম্পর্কিত। এই মানটি ভেরিফিকেশন সফল হয়েছে কিনা তা নির্দেশ করে না।

পরীক্ষার উদাহরণ

অ্যাপ লিঙ্ক যাচাইকরণ সফল হওয়ার জন্য, সিস্টেমকে অবশ্যই আপনার অ্যাপটিকে সেই সমস্ত ওয়েবসাইটের সাথে যাচাই করতে সক্ষম হতে হবে যা আপনি একটি নির্দিষ্ট ইন্টেন্ট ফিল্টারে উল্লেখ করেছেন এবং যা অ্যাপ লিঙ্কের মানদণ্ড পূরণ করে। নিম্নলিখিত উদাহরণটি একাধিক অ্যাপ লিঙ্ক সংজ্ঞায়িত একটি ম্যানিফেস্ট কনফিগারেশন দেখাচ্ছে:

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

স্টেটমেন্ট লিস্ট সম্পর্কে আরও জানতে, “ক্রিয়েটিং এ স্টেটমেন্ট লিস্ট” দেখুন।

অ্যান্ড্রয়েড ১৭ থেকে, সিস্টেম কীভাবে একটি নির্দিষ্ট URL রিজলভ করে তা নির্ণয় করতে আপনি অ্যাক্টিভিটি ম্যানেজার ( am start ) কমান্ডের সাথে --debug-link ফ্ল্যাগটি ব্যবহার করতে পারেন। এই টুলটি ইন্টেন্টের সাথে মিলে যাওয়া সম্ভাব্য অ্যাপগুলোর একটি বিশদ বিবরণ প্রদান করে, সাথে অ্যাপ ম্যানিফেস্ট এবং assetlinks.json ফাইল (ডাইনামিক অ্যাপ লিঙ্কের জন্য) থেকে রিজল্যুশনের সময় মূল্যায়ন করা নির্দিষ্ট নিয়মগুলোও দেখায়।

কোনো নির্দিষ্ট URL-এর লিঙ্ক রেজোলিউশন পরীক্ষা করতে, টার্মিনাল উইন্ডোতে নিম্নলিখিত কমান্ডটি চালান:

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 ) URI-টির সাথে মিলেছে।
  • অ্যাপ লিঙ্ক যাচাইকরণ: ডোমেইন যাচাইকরণের বর্তমান অবস্থা দেখায় (যেমন STATE_SUCCESS )।
  • ডাইনামিক অ্যাপ লিঙ্কস: যদি অ্যাপটি তার assetlinks.json ফাইলে ডাইনামিক অ্যাপ লিঙ্কস ম্যাচিং রুল ব্যবহার করে, তাহলে এই বিভাগে URI-এর বিপরীতে মূল্যায়ন করা প্রতিটি রুল তালিকাভুক্ত করা হয়। প্রতিটি রুলে মিলে যাওয়া URI ফিল্টার (যেমন পাথ প্রিফিক্স বা প্যাটার্ন) এবং একটি allow ফিল্ড উল্লেখ করা থাকে:
    • allow = 0 : একটি অনুমতি/অন্তর্ভুক্তি নিয়ম ( allow: true )। যদি এই নিয়মটি মিলে যায়, তাহলে অ্যাপটি URI-টি খোলার অনুমতি পায়।
    • allow = 1 : একটি ব্লক/বর্জন নিয়ম ( allow: false / exclude: true )। যদি এই নিয়মটি মিলে যায়, তাহলে অ্যাপটি URI-টি খুলতে পারবে না।
    • দ্রষ্টব্য : একটি খালি ফিল্টার স্ট্রিং ( 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 থেকে দুটি ডাইনামিক অ্যাপ লিঙ্ক নিয়ম মূল্যায়ন করেছে:

  • নিয়ম ০ ( allow = 1 , filter = /foo ): {"/": "/foo*", "exclude": true} থেকে তৈরি, এটি একটি বর্জন নিয়ম ( allow: false ) যা /foo পাথ প্রিফিক্স দিয়ে শুরু হওয়া URL-গুলিকে ব্লক করে।
  • নিয়ম ১ ( allow = 0 , filter = ): {"/": "*"} থেকে তৈরি, এটি একটি অন্তর্ভুক্তিমূলক নিয়ম ( allow: true ) যার পাথ প্রিফিক্স খালি ( filter = ), যা xyz.com অধীনে থাকা সমস্ত পাথের সাথে মেলে (ক্যাচ-অল)।

এই পরিস্থিতিতে সমাধান কীভাবে কাজ করে:

  1. নিয়ম ০ এবং নিয়ম ১ উভয়ই https://xyz.com/foo ইউআরএলটির সাথে মেলে।
  2. ডাইনামিক অ্যাপ লিঙ্ক নিয়মগুলো উপর থেকে নিচে ক্রমানুসারে মূল্যায়ন করা হয় (প্রথম মিলে যাওয়া নিয়মটিই জয়ী হয়)।
  3. যেহেতু স্টেটমেন্ট তালিকায় রুল ০ প্রথমে রয়েছে এবং এটি একটি বর্জন রুল ( allow = 1 ), তাই এটি সাধারণ allow রুলের ( রুল ১ ) উপর অগ্রাধিকার পায়।
  4. এই কারণে অ্যাপটি https://xyz.com/foo পরিচালনা করার সুযোগ থেকে বঞ্চিত হয়, যার ফলে সিস্টেমটি ব্রাউজারে ফিরে যায় অথবা একটি দ্ব্যর্থতা নিরসনকারী ডায়ালগ প্রদর্শন করে।