Jetpack Webkit-এর মাধ্যমে আপনার WebView ইমপ্লিমেন্টেশন সহজ করা

এই নির্দেশিকা Jetpack Webkit লাইব্রেরির সুবিধা বর্ণনা করে, এটি কীভাবে কাজ করে এবং কীভাবে আপনি এটি আপনার প্রোজেক্টে প্রয়োগ করতে পারেন তা ব্যাখ্যা করে।

এক নজরে

Android ডেভেলপমেন্টের ক্ষেত্রে ওয়েবভিউ একটি গুরুত্বপূর্ণ অংশ, তবে বিভিন্ন Android OS ভার্সন জুড়ে ফিচারের মধ্যে অসঙ্গতির কারণে কখনও কখনও এটি ম্যানেজ করা চ্যালেঞ্জিং হতে পারে। প্রতিটি Android OS ভার্সন WebView API-এর একটি নির্দিষ্ট সেট প্রদান করে। WebView-এর তুলনায় Android-এর আপডেট কম ঘন ঘন রিলিজ করা হয়, তাই Android API-তে WebView-এর সব ফিচার উপলভ্য নাও থাকতে পারে। এর ফলে ফিচার রোল-আউট করার গতি কমে যায় এবং টেস্টিংয়ের খরচ বেড়ে যায়।

Jetpack Webkit একটি কম্প্যাটিবিলিটি লেয়ার হিসেবে কাজ করে এবং ব্যবহারকারীর ডিভাইসে আপ-টু-ডেট WebView APK ব্যবহার করে এই সমস্যার সমাধান করে। এছাড়াও, এতে নতুন ও আধুনিক API আছে যা শুধুমাত্র এই লাইব্রেরিতেই উপলভ্য।

Jetpack Webkit কেন ব্যবহার করবেন?

ক্রস-ভার্সন কম্প্যাটিবিলিটি অফার করার পাশাপাশি, Jetpack Webkit নতুন ও আধুনিক API-ও অফার করে যা ডেভেলপমেন্ট সহজ করতে এবং আপনার অ্যাপের কার্যকারিতা উন্নত করতে পারে:

  • আধুনিক যাচাইকরণ চালু করে: WebView, WebAuthn-এর মতো আধুনিক ওয়েব যাচাইকরণ স্ট্যান্ডার্ড নির্বিঘ্নে ম্যানেজ করতে পারে, যা পাসকী-ভিত্তিক সাইন-ইন চালু করে। androidx.webkit লাইব্রেরি আপনাকে WebSettingsCompat.setWebAuthenticationSupport পদ্ধতি ব্যবহার করে এই ইন্টিগ্রেশনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যা আপনি আপনার অ্যাপের জন্য প্রয়োজনীয় সহায়তার লেভেল কনফিগার করতে ব্যবহার করতে পারেন।

  • পারফর্ম্যান্স উন্নত করে: setBackForwardCacheEnabled-এর মতো API ব্যবহার করে WebView-এর পারফর্ম্যান্স ফাইন-টিউন করুন অথবা prefetchUrlAsync ও prerenderUrlAsync-এর মতো স্পেকুলেটিভ লোডিং API ব্যবহার করে নেভিগেশন লেটেন্সি কমান। আরও তথ্যের জন্য, WebView-এ স্পেকুলেটিভ লোডিং দেখুন।

  • স্থিতিশীলতা বাড়ায়: ক্র্যাশ না করেই থেমে যাওয়া বা রেসপন্স না করা রেন্ডারার প্রসেস পুনরুদ্ধার করে। আরও তথ্যের জন্য, WebViewRenderProcess#terminate দেখুন।

  • ব্রাউজিং ডেটার উপর গ্র্যানুলার কন্ট্রোল অফার করে: নির্দিষ্ট অরিজিনের জন্য WebView-এর মাধ্যমে স্টোর করা ব্রাউজিং ডেটা মুছে দিতে, WebStorageCompat ক্লাস ব্যবহার করুন।

  • উন্নত পৃষ্ঠা নেভিগেশন প্রদান করে: NavigationListener ব্যবহার করে সূক্ষ্ম-দানাযুক্ত নেভিগেশন নিয়ন্ত্রণ, ইতিহাস এন্ট্রি প্রতিস্থাপন, সংরক্ষিত স্টেট হেডার সহায়তা এবং সম্পর্কিত লাইফসাইকেল ট্র্যাকিংয়ের জন্য WebView.loadUrl-এর পরিবর্তে WebViewCompat.navigate ব্যবহার করুন। আরও তথ্যের জন্য, WebViewCompat.navigate-এর মাধ্যমে উন্নত পৃষ্ঠা নেভিগেশন দেখুন।

  • স্টেট ম্যানেজমেন্ট অপ্টিমাইজ করে: স্টেট সিরিয়ালাইজেশনের সময় সর্বাধিক বাইট সীমা সেট করে TransactionTooLargeException থেকে সুরক্ষিত রাখে। আরও তথ্যের জন্য, WebView স্টেট দক্ষতার সাথে ম্যানেজ করুন দেখুন।

কম্পোনেন্ট সম্পর্কে বোঝা

Jetpack Webkit কার্যকরভাবে ব্যবহার করতে, আপনাকে নিম্নলিখিত কম্পোনেন্টের মধ্যে সম্পর্ক বুঝতে হবে:

  • Android System WebView: এটি হল Chromium-ভিত্তিক রেন্ডারিং ইঞ্জিন যা Google Play Store-এর মাধ্যমে Google নিয়মিত আপডেট করে, ঠিক যেভাবে Chrome আপডেট করা হয়। এতে সবচেয়ে আপ-টু-ডেট ফিচার থাকে এবং সব WebView API-এর জন্য ইমপ্লিমেন্টেশন কোড প্রদান করে।

  • ফ্রেমওয়ার্ক API (android.webkit): এগুলি হল এমন API যা নির্দিষ্ট Android OS ভার্সনের জন্য স্থির করা থাকে। যেমন, Android 10-এ কোনও অ্যাপ শুধু সেই API অ্যাক্সেস করতে পারে যা সেই ভার্সন রিলিজ হওয়ার সময় উপলভ্য ছিল। তাই, এটি আরও সাম্প্রতিক আপডেটে WebView APK-তে যোগ করা নতুন ফিচার ব্যবহার করতে পারে না। যেমন, WebView#getWebViewRenderProcess()-এর মাধ্যমে রেসপন্স না করা রেন্ডারার হ্যান্ডেল করতে, আপনি শুধুমাত্র Android 10 ও এর পরবর্তী যেকোনও ভার্সনে এটি কল করতে পারবেন।

  • Jetpack Webkit Library (androidx.webkit): এটি আপনার অ্যাপ্লিকেশনে বান্ডেল করা একটি ছোট লাইব্রেরি। এই লাইব্রেরি একটি ব্রিজ হিসেবে কাজ করে যা Android প্ল্যাটফর্মে সংজ্ঞায়িত API-তে কল করার পরিবর্তে WebView APK-তে কল করে, যার একটি নির্দিষ্ট OS ভার্সন রয়েছে। এইভাবে, Android 10-এর মতো পুরনো OS ভার্সনে চলা ডিভাইসে কোনও অ্যাপ্লিকেশন ইনস্টল করা থাকলেও, অ্যাপ্লিকেশনটি লেটেস্ট WebView ফিচার ব্যবহার করতে পারে। যেমন, WebViewCompat.getWebViewRenderProcess() ফ্রেমওয়ার্ক API-এর মতোই কাজ করে, তবে এটি Android 10-এর আগের সব OS ভার্সনেও কল করা যেতে পারে।

ফ্রেমওয়ার্ক ও Jetpack Webkit, দুটিতেই API উপলভ্য থাকলে, আমরা সাজেস্ট করি যে আপনি Jetpack Webkit ভার্সন বেছে নিন। এটি বিভিন্ন ধরনের ডিভাইসে একই ধরনের আচরণ ও সামঞ্জস্যতা নিশ্চিত করতে সাহায্য করে।

Jetpack Webkit ও APK ইন্টার‍্যাকশন

Jetpack Webkit-এ API দুটি ভাগে প্রয়োগ করা হয়:

  • Static Jetpack Webkit: Static Jetpack Webkit লাইব্রেরিতে API প্রয়োগ করার জন্য প্রয়োজনীয় কোডের খুব সামান্য অংশ থাকে।

  • WebView APK: WebView APK-তে বেশিরভাগ কোড থাকে।

আপনার অ্যাপ Jetpack Webkit API-কে কল করে, যা পরে WebView APK-কে কল করে।

আপনি নিজের অ্যাপে Jetpack Webkit ভার্সন কন্ট্রোল করলেও, ব্যবহারকারীর ডিভাইসে WebView APK আপডেট কন্ট্রোল করতে পারবেন না। সাধারণত, বেশিরভাগ ব্যবহারকারীর কাছে WebView APK-এর আপ-টু-ডেট ভার্সন থাকে, তবে আপনার অ্যাপকে এখনও সতর্ক থাকতে হবে যাতে WebView APK-এর নির্দিষ্ট ভার্সন কাজ করে না এমন API-তে কল না করা হয়।

এছাড়াও, Jetpack Webkit ম্যানুয়ালি WebView ভার্সন চেক করার প্রয়োজনীয়তা দূর করে। কোনও ফিচার উপলভ্য কিনা তা নির্ধারণ করতে, এর ফিচার কনস্ট্যান্ট চেক করুন। যেমন, WebViewFeature.WEB_AUTHENTICATION।

এগুলি একসাথে কীভাবে কাজ করে

Jetpack Webkit, স্ট্যাটিক ফ্রেমওয়ার্ক API এবং ঘন ঘন আপডেট হওয়া WebView APK-এর মধ্যে পার্থক্য দূর করে। আপনি যখন ফিচার-শনাক্তকরণ প্যাটার্নের সাথে Jetpack Webkit API ব্যবহার করেন, তখন লাইব্রেরি চেক করে দেখে যে ব্যবহারকারীর ডিভাইসে ইনস্টল করা WebView APK-তে ফিচারটি কাজ করে কিনা। এর ফলে Android OS (ফ্রেমওয়ার্ক) ভার্সন চেক করার প্রয়োজন হয় না।

WebView APK-এর ভার্সন যথেষ্ট সাম্প্রতিক হলে, লাইব্রেরি ফিচারটি চালু করে। যদি তা না হয়, তাহলে এটি রিপোর্ট করে যে ফিচারটি উপলভ্য নয়, আপনার অ্যাপকে ক্র্যাশ হওয়া থেকে আটকায় এবং আপনাকে পরিস্থিতিটি সুন্দরভাবে সামলাতে সক্ষম করে।

Jetpack Webkit ও ফ্রেমওয়ার্ক API-এর তুলনা

এই বিভাগে Jetpack Webkit লাইব্রেরি সহ এবং ছাড়া প্রয়োগের পদ্ধতিগুলির তুলনা করা হয়েছে:

উন্নতমানের যাচাইকরণ (WebAuthn) চালু করুন

Jetpack Webkit ছাড়া

ফ্রেমওয়ার্ক API-এর মাধ্যমে সম্ভব নয়।

Jetpack Webkit-এর মাধ্যমে

কম্প্যাটিবিলিটি চেক করার জন্য WebViewFeature.WEB_AUTHENTICATION ব্যবহার করে।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
  WebSettingsCompat.setWebAuthenticationSupport(
      webView.settings,
      WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
  )
}

কোনও অরিজিনের (সাইট-নির্দিষ্ট স্টোরেজ) জন্য ডেটা মুছে ফেলা

Jetpack WebKit ছাড়া

নির্দিষ্ট অরিজিন ডেটা মোছার জন্য কোনও সরাসরি API নেই। প্রায়ই সব ডেটা মুছে ফেলার প্রয়োজন হয়।

Jetpack WebKit-এর মাধ্যমে

সঠিকভাবে ডেটা মুছে ফেলার জন্য কম্প্যাটিবিলিটি API ব্যবহার করে। আপনি নিম্নলিখিত বিকল্পগুলির মধ্যে যেকোনও একটি ব্যবহার করতে পারেন:

WebStorageCompat.getInstance().deleteBrowsingData()

অথবা

WebStorageCompat.getInstance().deleteBrowsingDataForSite()

WebView ভার্সন পান

Jetpack WebKit ছাড়া

স্ট্যান্ডার্ড ফ্রেমওয়ার্ক ক্লাস ব্যবহার করে।

val webViewPackage = WebView.getCurrentWebViewPackage()

Jetpack WebKit-এর মাধ্যমে

আরও নিরাপদে ডেটা ফিরিয়ে আনার জন্য কম্প্যাটিবিলিটি লেয়ার ব্যবহার করে।

val webViewPackage = WebViewCompat.getCurrentWebViewPackage()

উত্তর না দেওয়া রেন্ডারার (রেন্ডারার ক্লায়েন্ট) ম্যানেজ করুন

Jetpack WebKit ছাড়া

স্ট্যান্ডার্ড ফ্রেমওয়ার্ক পদ্ধতি ব্যবহার করে।

webView.setWebViewRenderProcessClient(myClient)

Jetpack WebKit-এর মাধ্যমে

ক্লায়েন্ট সেট করার জন্য WebViewCompat এবং ফিচার চেক ব্যবহার করে।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
  WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}

ক্র্যাশ রিকভারি স্ট্র্যাটেজি প্রয়োগ করার ব্যাপারে নির্দেশিকা পেতে, WebView টার্মিনেশন ম্যানেজ করা দেখুন। API সংক্রান্ত বিবরণের জন্য, androidx.webkit রেফারেন্স ডকুমেন্টেশন দেখুন।

সেভ করা রাজ্য ও ট্রানজ্যাকশনের সাইজ ম্যানেজ করুন

WebViewCompat.saveState API আপনাকে বাইট সীমা এনফোর্স করতে এবং সিরিয়ালাইজেশনের সময় ফরওয়ার্ড ইতিহাস প্রুন করতে দেয়, যা প্রয়োজনীয় নেভিগেশন ইতিহাস সংরক্ষণ করার সময় TransactionTooLargeException ক্র্যাশ হওয়া প্রতিরোধ করে।

Jetpack WebKit ছাড়া

স্ট্যান্ডার্ড ফ্রেমওয়ার্ক পদ্ধতি ব্যবহার করে, যা সাইজের সীমা ছাড়াই সম্পূর্ণ নেভিগেশন স্ট্যাককে সিরিয়ালাইজ করে এবং পেলোড Android-এর ১ এমবি ট্রানজ্যাকশন সীমা অতিক্রম করলে TransactionTooLargeException ট্রিগার করতে পারে।

webView.saveState(outState)

Jetpack WebKit-এর মাধ্যমে

সর্বাধিক বাইট সীমা এনফোর্স করতে বা ফরওয়ার্ড নেভিগেশন এন্ট্রি ড্রপ করতে WebViewCompat ব্যবহার করে, ট্রানজ্যাকশন ওভারফ্লো থেকে রক্ষা করে।

WebViewCompat.saveState(webView, outState, maxSizeBytes)

আরও তথ্যের জন্য, WebView স্টেট দক্ষতার সাথে ম্যানেজ করুন দেখুন।

ইতিহাস এন্ট্রি রিপ্লেসমেন্ট, সেভ করা স্টেট হেডার সাপোর্ট ও সম্পর্কিত লাইফসাইকেল কলব্যাকের জন্য সাপোর্ট সহ ওয়েব পেজ নেভিগেট করতে, WebView.loadUrl-এর পরিবর্তে WebViewCompat.navigate ব্যবহার করুন।

Jetpack WebKit ছাড়া

WebView.loadUrl ব্যবহার করে, যা ইতিহাস এন্ট্রি রিপ্লেসমেন্ট বা সম্পর্কিত লাইফসাইকেল কলব্যাক ট্র্যাকিং সাপোর্ট করে না।

webView.loadUrl("https://www.example.com")

Jetpack WebKit-এর মাধ্যমে

ইতিহাসের এন্ট্রি পরিবর্তন করতে, সেভ করা অবস্থায় কাস্টম হেডার সংরক্ষণ করতে এবং নেভিগেশন অবস্থা ট্র্যাক করতে NavigationParameters-এর সাথে WebViewCompat.navigate ব্যবহার করে।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEBVIEW_NAVIGATE_EXPERIMENTAL_V1)) {
  val params = NavigationParameters.Builder()
      .setShouldReplaceCurrentEntry(true)
      .build()
  val navigation = WebViewCompat.navigate(webView, "https://www.example.com", params)
} else {
  webView.loadUrl("https://www.example.com")
}

নেভিগেশন ট্র্যাকিং ও প্যারামিটার কনফিগারেশন সম্পর্কে আরও জানতে, WebViewCompat.navigate-এর মাধ্যমে উন্নত পৃষ্ঠা নেভিগেশন দেখুন।

আপনার কোডে Jetpack Webkit ইন্টিগ্রেট করুন

Jetpack Webkit ব্যবহার করলে স্ট্যান্ডার্ড WebView ক্লাসের ক্ষমতা বৃদ্ধি পায়, তবে এটি অরিজিনাল WebView ক্লাসকে সম্পূর্ণভাবে প্রতিস্থাপন করে না।

আপনি android.webkit.WebView ক্লাস ব্যবহার করা চালিয়ে যেতে পারবেন। আপনি এটি আপনার XML লেআউটে যোগ করতে এবং আপনার কোডে ইনস্ট্যান্সের রেফারেন্স পেতে পারেন। স্ট্যান্ডার্ড ফ্রেমওয়ার্ক ফিচার অ্যাক্সেস করতে, আপনি এখনও সরাসরি WebView ইনস্ট্যান্স বা এর সেটিংস অবজেক্টে মেথড কল করতে পারেন।

আধুনিক ফিচার অ্যাক্সেস করতে, আপনি Jetpack Webkit-এর মাধ্যমে প্রদান করা স্ট্যাটিক হেল্পার পদ্ধতি ব্যবহার করেন, যেমন WebViewCompat এবং WebSettingsCompat। আপনি এইসব পদ্ধতিতে আপনার আগে থেকে থাকা WebView ইনস্ট্যান্স পাস করেন।

Kotlin

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}

জাভা

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}

Jetpack Webkit প্রয়োগ করা

Jetpack Webkit প্রয়োগ করতে, নিম্নলিখিত পদ্ধতি অনুসরণ করুন।

ধাপ ১: ডিপেন্ডেন্সি যোগ করুন

আপনার মডিউলের build.gradle.kts বা build.gradle ফাইলে, Jetpack Webkit যোগ করতে নিম্নলিখিত ডিপেন্ডেন্সি অন্তর্ভুক্ত করুন:

গ্রোভি

dependencies {
    implementation "androidx.webkit:webkit:1.17.1"
}

কোটলিন

dependencies {
    implementation("androidx.webkit:webkit:1.17.1")
}

Jetpack Webkit-এ পাতলা র‍্যাপার থাকে, তাই আপনার অ্যাপ্লিকেশনের সাইজের উপর এর প্রভাব ন্যূনতম।

ধাপ ২: ফিচার-ডিটেকশন প্যাটার্ন গ্রহণ করা

অনুপলভ্য API কল করার সময় ক্র্যাশ হওয়া আটকাতে, ফিচার চেক ব্যবহার করুন। আমরা সাজেস্ট করি যে প্রতিটি API ইনভোকেশনকে ফিচার চেকের মাধ্যমে ঘিরে রাখুন এবং API উপলভ্য না থাকলে ফলব্যাক লজিক বিবেচনা করুন।

আধুনিক WebView API ব্যবহার করার জন্য আমরা নিম্নলিখিত প্যাটার্ন সাজেস্ট করি:

Kotlin

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

val webView: WebView = findViewById(R.id.my_webview)

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
    // Optionally, provide a fallback for older WebView versions.
}

জাভা

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

WebView webView = findViewById(R.id.my_webview);

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
    // Optionally, provide a fallback for older WebView versions.
}

এই প্যাটার্ন অ্যাপ্লিকেশনটি যাতে শক্তিশালী হয় তা নিশ্চিত করতে সাহায্য করে। ফিচার চেক প্রথমে রান করে বলে, ফিচার উপলভ্য না থাকলেও অ্যাপ্লিকেশন ক্র্যাশ করে না। WebViewFeature#isFeatureSupported চেক করার পারফর্ম্যান্স ওভারহেড নগণ্য।