অ্যাপ লিঙ্কের জন্য ইন্টেন্ট ফিল্টার যোগ করুন

অ্যাপ লিঙ্ক হলো ডিপ লিঙ্ক যা HTTP বা HTTPS স্কিম ব্যবহার করে এবং আপনার ওয়েবসাইটের সাথে সংশ্লিষ্ট হিসেবে অ্যান্ড্রয়েড দ্বারা যাচাই করা হয়। অ্যাপ লিঙ্ক পরিচালনা করার জন্য নিবন্ধন করতে, এই ধাপগুলো অনুসরণ করুন:

  1. আপনার অ্যাপ ম্যানিফেস্টে এক বা একাধিক ইন্টেন্ট ফিল্টার যোগ করুন, যেগুলোতে আপনার ওয়েবসাইটের ডোমেইন বা ইউআরএলগুলো উল্লেখ করা থাকবে।
  2. Intent ফিল্টার এলিমেন্টগুলিতে autoVerify="true"attribute যোগ করুন। এটি সিস্টেমকে সংকেত দেয় যে, এটি যেন আপনার ওয়েবসাইটের assetlinks.json কনফিগারেশনের সাথে স্কিম এবং হোস্ট ডোমেইন(গুলি) যাচাই করার চেষ্টা করে।
  3. ওয়েবসাইট সংযোগগুলো ঘোষণা করুন।

নিম্নলিখিতটি হলো স্কিম এবং হোস্টের পাশাপাশি autoVerify="true " সহ একটি অ্যাপ লিঙ্ক ঘোষণার উদাহরণ:

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <!-- 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 link that uses the "http" scheme, your
             app should be able to delegate that traffic to "https". -->
        <!-- Do not include other schemes, as this will prevent verification. -->
        <data android:scheme="http" />
        <data android:scheme="https" />

        <!-- Include one or more domains that should be verified. -->
        <data android:host="www.example.com" />
        <data android:host="*.example.com" />
    </intent-filter>
</activity>

কোড সম্পর্কে মূল বিষয়গুলো

  • অটোভেরিফাই : অ্যাপ লিঙ্কের জন্য android:autoVerify="true" অ্যাট্রিবিউটটি আবশ্যক। এটি সিস্টেমকে সংকেত দেয় যে, <data> ট্যাগে উল্লেখিত স্কিম এবং ডোমেন(গুলি)র সাথে আপনার অ্যাপের সংযোগ যাচাই করার চেষ্টা করা উচিত। যে সমস্ত ইন্টেন্ট ফিল্টার আপনি যাচাইযোগ্য করতে চান, সেগুলিতে autoVerify="true " যোগ করার পরামর্শ দেওয়া হয়।
  • ডেটা এলিমেন্ট : প্রতিটি অ্যাপ লিঙ্কস ইনটেন্ট ফিল্টারে অবশ্যই এক বা একাধিক <data> এলিমেন্ট অন্তর্ভুক্ত থাকতে হবে, যা আপনার যাচাইযোগ্য ওয়েবসাইট ডোমেইনের সাথে মেলে এমন স্কিম এবং হোস্ট ফরম্যাট নির্দিষ্ট করে।
  • স্কিম : ইন্টেন্ট ফিল্টারে http এবং https উভয় স্কিমের জন্যই <data> এলিমেন্ট অন্তর্ভুক্ত থাকতে হবে।
  • হোস্ট : আপনি ঐচ্ছিকভাবে এক বা একাধিক হোস্ট মেলানোর জন্য <data> এলিমেন্ট যোগ করতে পারেন। একাধিক সাবডোমেন মেলানোর জন্য একটি ওয়াইল্ডকার্ড ( * ) ব্যবহার করুন (যেমন *.example.com )। সিস্টেমটি আপনার ওয়েবসাইটে থাকা assetlinks.json ফাইলের সাথে প্রতিটি হোস্ট যাচাই করার চেষ্টা করবে। মনে রাখবেন যে, যেকোনো পাথ-লেভেল রাউটিং assetlinks.json ফাইলের মাধ্যমেই পরিচালনা করা উচিত (নিচের সেরা অনুশীলন বিভাগটি দেখুন)।

  • একাধিক হোস্ট : আপনি যদি একাধিক হোস্ট ডোমেইন ঘোষণা করেন, তাহলে সিস্টেম (অ্যান্ড্রয়েড ১২+ এ) প্রতিটি যাচাই করার চেষ্টা করে। যদি কোনো একটি হোস্ট যাচাই হয়ে যায়, তাহলে অ্যাপটি সেই যাচাইকৃত হোস্টের লিঙ্কগুলির জন্য ডিফল্ট হ্যান্ডলার হয়ে যায়। অ্যান্ড্রয়েড ১১ এবং তার নিচের সংস্করণগুলিতে, যদি একটি হোস্টও যাচাই করা না যায়, তাহলে যাচাইকরণ ব্যর্থ হয়।

  • একাধিক ইনটেন্ট ফিল্টার : যখন আপনার উদ্দেশ্য স্বতন্ত্র URL (যেমন স্কিম এবং হোস্টের একটি নির্দিষ্ট সংমিশ্রণ) ঘোষণা করা হয়, তখন আলাদা ফিল্টার তৈরি করা গুরুত্বপূর্ণ। কারণ, একই ইনটেন্ট ফিল্টারের মধ্যে থাকা একাধিক <data> এলিমেন্ট তাদের সম্মিলিত অ্যাট্রিবিউটের সমস্ত ভিন্নতা বিবেচনা করার জন্য একত্রিত হয়ে যায়।

ম্যানিফেস্ট ফিল্টার নিয়মের জন্য বিবেচ্য বিষয়সমূহ

আপনি যদি অ্যান্ড্রয়েড ১৫ এবং তার পরবর্তী সংস্করণগুলিতে ডাইনামিক অ্যাপ লিঙ্কের সাথে ব্যবহারের জন্য ফিল্টার সেট আপ করেন, তবে এটা মনে রাখা গুরুত্বপূর্ণ যে সার্ভার-সাইডের assetlinks.json ফাইলে ঘোষিত ডাইনামিক নিয়মগুলি আপনার অ্যাপ ম্যানিফেস্টে স্থিরভাবে ঘোষিত URL নিয়মগুলির পরিধি প্রসারিত করতে পারে না।

এই কারণে, আমরা এই পদ্ধতিটি ব্যবহারের সুপারিশ করি:

  • আপনার অ্যাপ ম্যানিফেস্টে, শুধুমাত্র স্কিম এবং ডোমেইন ঘোষণা করার মাধ্যমে সম্ভাব্য সর্বাধিক বিস্তৃত স্কোপ সেট করুন।
  • পাথ-লেভেল রাউটিং-এর মতো আরও পরিমার্জনের জন্য সার্ভার-সাইডের assetlinks.json রুলগুলোর ওপর নির্ভর করুন।

এই আদর্শ কনফিগারেশনের মাধ্যমে, আপনি প্রয়োজন অনুযায়ী assetlinks.json ফাইলে ডায়নামিকভাবে নতুন অ্যাপ লিঙ্ক পাথ যোগ করতে পারবেন, এই জেনে যে সেগুলি আপনার অ্যাপ ম্যানিফেস্টে সেট করা বিস্তৃত পরিধির মধ্যেই থাকবে।

একাধিক হোস্টের জন্য সাপোর্ট অ্যাপ লিঙ্ক

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

উদাহরণস্বরূপ, নিম্নলিখিত ইন্টেন্ট ফিল্টার সহ একটি অ্যাপ শুধুমাত্র https://www.example.com জন্য ভেরিফিকেশন পাস করবে, যদি একটি assetlinks.json ফাইল 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>

একাধিক সাবডোমেনের জন্য অ্যাপ লিঙ্কিং সমর্থন

ডিজিটাল অ্যাসেট লিঙ্কস প্রোটোকল আপনার ইন্টেন্ট ফিল্টারের সাবডোমেনগুলোকে স্বতন্ত্র, পৃথক হোস্ট হিসেবে গণ্য করে। তাই যদি আপনার ইন্টেন্ট ফিল্টারে বিভিন্ন সাবডোমেনসহ একাধিক হোস্ট তালিকাভুক্ত থাকে, তবে আপনাকে অবশ্যই প্রতিটি ডোমেনে একটি বৈধ assetlinks.json প্রকাশ করতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত ইন্টেন্ট ফিল্টারটিতে www.example.com এবং mobile.example.com গৃহীত ইন্টেন্ট ইউআরএল হোস্ট হিসেবে অন্তর্ভুক্ত করা হয়েছে। সুতরাং, https://www.example.com/.well-known/assetlinks.json এবং https://mobile.example.com/.well-known/assetlinks.json উভয় স্থানেই একটি বৈধ 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 ) প্রকাশ করতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত ইন্টেন্ট ফিল্টার সহ একটি অ্যাপ example.com এর যেকোনো সাব-নেমের (যেমন foo.example.com ) জন্য ভেরিফিকেশন পাস করবে, যতক্ষণ পর্যন্ত assetlinks.json ফাইলটি 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 কল করার ফলাফল থাকবে। ব্যবহারকারী ডায়ালগে প্রদর্শিত মিলে যাওয়া অ্যাপের তালিকা থেকে তার পছন্দের অ্যাপটি বেছে নিতে পারবেন।

ডাইনামিক অ্যাপ লিঙ্ক ফিচারগুলো, যার মধ্যে assetlinks.json এ উন্নত ম্যাচিং নিয়ম এবং <uri-relative-filter-group> -এর ব্যবহার অন্তর্ভুক্ত, শুধুমাত্র অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) এবং তার পরবর্তী সংস্করণগুলোতে সম্পূর্ণরূপে সমর্থিত।

অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং এর নিচের সংস্করণগুলোতে, সিস্টেম অ্যাপ লিঙ্ক যাচাইকরণের জন্য শুধুমাত্র আপনার ম্যানিফেস্টের <data> এলিমেন্টে ঘোষিত scheme এবং host বিবেচনা করে। পাথ-নির্দিষ্ট নিয়ম, বর্জন এবং assetlinks.json থেকে আসা ডাইনামিক আপডেটগুলো প্রয়োগ করা হয় না।

এর মানে হলো, যদি আপনার ম্যানিফেস্টে শুধুমাত্র scheme এবং host উল্লেখ করা থাকে, তাহলে অ্যান্ড্রয়েড ১৫ এবং তার উপরের সংস্করণের জন্য আপনার assetlinks.json এ পাথ-নির্দিষ্ট নিয়ম সংজ্ঞায়িত করা থাকা সত্ত্বেও, আপনার অ্যাপটি অ্যান্ড্রয়েড ১৪ এবং তার নিচের সংস্করণগুলোতে অপ্রত্যাশিতভাবে ভেরিফাইড ডোমেইনের সমস্ত পাথ ক্যাপচার করে ফেলতে পারে।

যখন আপনি অ্যান্ড্রয়েড ১৫ এবং তার উপরের সংস্করণগুলিতে আরও নির্দিষ্ট পাথের জন্য ডাইনামিক অ্যাপ লিঙ্ক ব্যবহার করতে চান, তখন অ্যান্ড্রয়েড ১৪ এবং তার নিচের সংস্করণগুলিতে আপনার অ্যাপ যাতে কোনো ডোমেইনের সমস্ত লিঙ্ক হ্যান্ডেল না করে, তা প্রতিরোধ করতে আপনার ম্যানিফেস্টের ইন্টেন্ট ফিল্টারে একটি অমিল পাথ অন্তর্ভুক্ত করুন। একটি android:path অ্যাট্রিবিউট সহ একটি <data> এলিমেন্ট যোগ করুন, যেটি আপনার লিঙ্কগুলির জন্য বৈধ পাথ হওয়ার সম্ভাবনা খুবই কম। এটি নিশ্চিত করে যে ইন্টেন্ট ফিল্টারটি নিম্ন সংস্করণগুলিতে সমস্ত পাথের সাথে মিলবে না।

উদাহরণ:

<activity
    android:name=".MainActivity"
    android:exported="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" />

        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.example.com" />

        <!-- Add a non-matching path for backward compatibility -->
        <data android:path="/no_match_for_older_android_versions" />

        <uri-relative-filter-group android:allow="true">
          <data android:pathPattern="/.*"/>
        </uri-relative-filter-group>
    </intent-filter>
</activity>

<data android:path="/no_match_for_older_android_versions" /> যোগ করার মাধ্যমে, আপনি নিশ্চিত করেন যে Android 14 এবং তার নিচের সংস্করণগুলিতে এই ইন্টেন্ট ফিল্টারটি কোনো ইনকামিং লিঙ্কের সাথে ম্যাচ করবে না, কিন্তু একই সাথে আপনার assetlinks.json ফাইলের অ্যাডভান্সড ম্যাচিং নিয়মের উপর ভিত্তি করে Android 15 এবং তার উপরের সংস্করণগুলিতে ডাইনামিক অ্যাপ লিঙ্কের জন্য ডোমেইনটি ভেরিফাই করা যাবে।

আপনার ম্যানিফেস্টে যদি আগে থেকেই নির্দিষ্ট পাথ রুল (যেমন android:pathPrefix ) সহ অ্যাপ লিঙ্ক থাকে এবং আপনি অ্যান্ড্রয়েড ১৫ ও তার পরবর্তী সংস্করণগুলিতে ডাইনামিক অ্যাপ লিঙ্ক ব্যবহার শুরু করতে চান, তাহলে আপনি নিশ্চিন্তে <uri-relative-filter-group> এলিমেন্টটি সরাসরি আপনার বিদ্যমান ইন্টেন্ট ফিল্টারগুলিতে যোগ করতে পারেন।

যেহেতু অ্যান্ড্রয়েড ১৪ এবং এর নিচের সংস্করণগুলো <uri-relative-filter-group> এলিমেন্টটিকে উপেক্ষা করে, তাই আপনার বিদ্যমান অ্যাপ লিঙ্কগুলো অ্যান্ড্রয়েডের নিম্ন সংস্করণের ডিভাইসগুলোতে এখনকার মতোই কাজ করতে থাকবে।

তবে, অ্যান্ড্রয়েড ১৫ এবং এর পরবর্তী সংস্করণগুলো 'মিশ্র' কনফিগারেশনকে কীভাবে মূল্যায়ন করে, তা আপনাকে অবশ্যই সতর্কতার সাথে বিবেচনা করতে হবে:

  • দ্বি-স্তরীয় ফিল্টারিং: অ্যান্ড্রয়েড ১৫ এবং তার পরবর্তী সংস্করণগুলিতে, সিস্টেম ইন্টেন্ট ফিল্টারগুলিকে একটি ইউনিয়ন হিসাবে মূল্যায়ন করে। একটি URL ম্যানিফেস্ট চেক পাস করে যদি এটি আপনার লিগ্যাসি স্ট্যাটিক <data> ট্যাগ অথবা আপনার <uri-relative-filter-group> -এ থাকা সাধারণ নিয়মগুলির যেকোনো একটি পূরণ করে। URL-টি এই প্রাথমিক ম্যানিফেস্ট চেক পাস করার পর, সিস্টেম আরও সূক্ষ্ম ফিল্টারিংয়ের দ্বিতীয় স্তর হিসাবে আপনার assetlinks.json ফাইলে সংজ্ঞায়িত ডাইনামিক নিয়মগুলি প্রয়োগ করে। এর মানে হল, সার্ভার-সাইড JSON নিয়মগুলিই চূড়ান্তভাবে নির্ধারণ করে যে মিলে যাওয়া URL-গুলির মধ্যে কোনটি আসলে অ্যাপটি খুলবে।

হাইব্রিড কনফিগারেশনের উদাহরণ:

<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="www.example.com" />

    <!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
         also use this. -->
    <data android:pathPrefix="/store" />

    <!--
      Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
      evaluate this as a union between all paths and the configuration
      specified in the assetlinks.json file. Make sure to apply further
      refinements in the assetlinks.json file to prevent all URL paths from
      opening in the app.
    -->
    <uri-relative-filter-group android:allow="true">
        <data android:pathPrefix="/" />
    </uri-relative-filter-group>
</intent-filter>