پیاده‌سازی WebView خود را با Jetpack Webkit ساده کنید

این راهنما مزایای کتابخانه Jetpack Webkit، نحوه عملکرد آن و نحوه پیاده‌سازی آن در پروژه‌هایتان را شرح می‌دهد.

نمای کلی

وب‌ویوها بخش اساسی توسعه اندروید هستند، اما گاهی اوقات به دلیل ناهماهنگی در ویژگی‌ها در نسخه‌های مختلف سیستم عامل اندروید، مدیریت آنها می‌تواند چالش برانگیز باشد. هر نسخه سیستم عامل اندروید مجموعه‌ای ثابت از APIهای WebView را ارائه می‌دهد. از آنجا که اندروید با سرعت کمتری نسبت به WebView منتشر می‌شود، APIهای اندروید ممکن است تمام ویژگی‌های موجود WebView را پوشش ندهند. این امر منجر به کندتر شدن روند انتشار ویژگی‌ها و افزایش هزینه‌های آزمایش می‌شود.

Jetpack Webkit با عمل کردن به عنوان یک لایه سازگاری و استفاده از آخرین نسخه WebView APK روی دستگاه کاربر، این مشکلات را حل می‌کند. همچنین شامل APIهای جدید و مدرنی است که منحصراً در این کتابخانه موجود هستند.

چرا از Jetpack Webkit استفاده کنیم؟

علاوه بر ارائه سازگاری بین نسخه‌های مختلف، Jetpack Webkit همچنین APIهای جدید و مدرنی را ارائه می‌دهد که می‌توانند توسعه را ساده کرده و عملکرد برنامه شما را بهبود بخشند:

  • فعال‌سازی احراز هویت مدرن : وب‌ویو می‌تواند به طور یکپارچه استانداردهای مدرن احراز هویت وب مانند WebAuthn را مدیریت کند و ورود به سیستم مبتنی بر کلید عبور را فعال کند. کتابخانه androidx.webkit با استفاده از متد WebSettingsCompat.setWebAuthenticationSupport() کنترل کامل بر این ادغام را به شما می‌دهد، که می‌توانید از آن برای پیکربندی سطح پشتیبانی مورد نیاز برنامه خود استفاده کنید.

  • بهبود عملکرد : عملکرد WebView را برای موارد استفاده برنامه خود با استفاده از APIهایی مانند prefetchUrlAsync ، prerenderUrlAsync و setBackForwardCacheEnabled به طور دقیق تنظیم کنید.

  • افزایش پایداری : بازیابی فرآیندهای رندر متوقف شده یا غیرپاسخگو بدون از کار افتادن. برای اطلاعات بیشتر، به WebViewRenderProcess#terminate() مراجعه کنید.

  • کنترل جزئی بر داده‌های مرور ارائه می‌دهد : برای حذف داده‌های مرور ذخیره شده توسط WebView برای مبداهای خاص، از کلاس WebStorageCompat استفاده کنید.

اجزا را درک کنید

برای استفاده‌ی مؤثر از Jetpack Webkit، باید رابطه‌ی بین اجزای زیر را درک کنید:

  • وب‌ویو سیستم اندروید : این موتور رندر مبتنی بر کرومیوم است که گوگل به‌طور منظم از طریق فروشگاه گوگل پلی و همزمان با کروم به‌روزرسانی می‌کند. این موتور شامل به‌روزترین ویژگی‌ها است و کد پیاده‌سازی زیربنایی را برای همه APIهای وب‌ویو فراهم می‌کند.

  • APIهای چارچوب ( android.webkit ) : اینها APIهایی هستند که برای یک نسخه خاص از سیستم عامل اندروید ثابت شده‌اند. به عنوان مثال، یک برنامه در اندروید ۱۰ فقط می‌تواند به APIهایی که هنگام انتشار آن نسخه در دسترس بوده‌اند دسترسی داشته باشد. بنابراین، نمی‌تواند از ویژگی‌های جدیدی که در به‌روزرسانی‌های اخیر به WebView APK اضافه شده‌اند استفاده کند. به عنوان مثال، برای مدیریت یک رندرکننده‌ی بی‌پاسخ با WebView#getWebViewRenderProcess() ، فقط می‌توانید این را در اندروید ۱۰ و بالاتر فراخوانی کنید.

  • کتابخانه Jetpack Webkit ( androidx.webkit ) : این یک کتابخانه کوچک است که در برنامه شما قرار دارد. این کتابخانه به عنوان پلی عمل می‌کند که به WebView APK فراخوانی می‌شود، نه به API های تعریف شده در پلتفرم اندروید که نسخه سیستم عامل ثابتی دارند. به این ترتیب، حتی وقتی یک برنامه روی دستگاهی با نسخه سیستم عامل قدیمی‌تر مانند اندروید ۱۰ نصب می‌شود، برنامه می‌تواند از جدیدترین ویژگی‌های WebView استفاده کند. به عنوان مثال، WebViewCompat.getWebViewRenderProcess() مشابه API Framework عمل می‌کند، با این تفاوت که می‌توان آن را در تمام نسخه‌های سیستم عامل قبل از اندروید ۱۰ نیز فراخوانی کرد.

اگر یک API هم در چارچوب و هم در Jetpack Webkit موجود است، توصیه می‌کنیم نسخه Jetpack Webkit را انتخاب کنید. این به تضمین رفتار و سازگاری مداوم در طیف وسیعی از دستگاه‌ها کمک می‌کند.

تعامل Jetpack Webkit و APK

APIهای موجود در Jetpack Webkit در دو بخش پیاده‌سازی شده‌اند:

  • وب‌کیت ایستا جت‌پک : کتابخانه وب‌کیت ایستا جت‌پک شامل بخش کوچکی از کدی است که مسئول پیاده‌سازی API است.

  • فایل APK مربوط به WebView : فایل APK مربوط به WebView شامل بیشتر کدها است.

برنامه شما API مربوط به Jetpack Webkit را فراخوانی می‌کند، که سپس WebView APK را فراخوانی می‌کند.

در حالی که شما نسخه Jetpack Webkit را در برنامه خود کنترل می‌کنید، نمی‌توانید به‌روزرسانی‌های WebView APK را در دستگاه‌های کاربران کنترل کنید. به طور کلی، اکثر کاربران نسخه‌های به‌روز WebView APK را دارند، اما برنامه شما همچنان باید محتاط باشد که APIهایی را که آن نسخه خاص از WebView APK پشتیبانی نمی‌کند، فراخوانی نکند.

Jetpack Webkit همچنین نیاز به بررسی دستی نسخه‌های WebView را از بین می‌برد. برای تعیین اینکه آیا یک ویژگی در دسترس است، ثابت ویژگی آن را بررسی کنید. به عنوان مثال، WebViewFeature.WEB_AUTHENTICATION .

چگونه آنها با هم کار می‌کنند

Jetpack Webkit فاصله بین API استاتیک Framework و APK WebView که مرتباً به‌روزرسانی می‌شود را پر می‌کند. وقتی از API Jetpack Webkit با الگوی تشخیص ویژگی استفاده می‌کنید، کتابخانه بررسی می‌کند که آیا ویژگی مورد نظر توسط APK WebView نصب شده روی دستگاه کاربر پشتیبانی می‌شود یا خیر. این مزیت را دارد که نیازی به بررسی نسخه سیستم عامل اندروید (framework) نیست.

اگر فایل APK مربوط به WebView به اندازه کافی جدید باشد، کتابخانه این ویژگی را فراخوانی می‌کند. در غیر این صورت، گزارش می‌دهد که این ویژگی در دسترس نیست و از خرابی برنامه شما جلوگیری می‌کند و به شما امکان می‌دهد تا به راحتی وضعیت را مدیریت کنید.

مقایسه‌ی Jetpack Webkit و APIهای Framework

این بخش روش‌های پیاده‌سازی را با و بدون کتابخانه Jetpack Webkit مقایسه می‌کند:

فعال کردن احراز هویت مدرن (WebAuthn)

بدون جت‌پک وب‌کیت

از طریق APIهای چارچوب امکان‌پذیر نیست.

با Jetpack Webkit

از WebViewFeature.WEB_AUTHENTICATION برای بررسی سازگاری استفاده می‌کند.

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

حذف داده‌ها برای یک مبدا (ذخیره‌سازی مختص سایت)

بدون جت‌پک وب‌کیت

هیچ API مستقیمی برای پاک کردن داده‌های مبدا خاص وجود ندارد. اغلب نیاز به پاک کردن تمام داده‌ها است.

با Jetpack WebKit

از APIهای سازگاری برای حذف دقیق داده‌ها استفاده می‌کند. می‌توانید از یکی از گزینه‌های زیر استفاده کنید:

WebStorageCompat.getInstance().deleteBrowsingData()

یا

WebStorageCompat.getInstance().deleteBrowsingDataForSite()

دریافت نسخه وب ویو

بدون جت‌پک وب‌کیت

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

val webViewPackage = WebView.getCurrentWebViewPackage()

با Jetpack WebKit

از لایه سازگاری برای بازیابی ایمن‌تر استفاده می‌کند.

val webViewPackage = WebViewCompat.getCurrentWebViewPackage()

مدیریت رندرکننده‌ی بی‌پاسخ (سرویس‌گیرنده‌ی رندرکننده)

بدون جت‌پک وب‌کیت

از روش چارچوب استاندارد استفاده می‌کند.

webView.setWebViewRenderProcessClient(myClient)

با Jetpack WebKit

از WebViewCompat و بررسی ویژگی‌ها برای تنظیم کلاینت استفاده می‌کند.

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

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

جت‌پک وب‌کیت را در کد خود ادغام کنید

استفاده از Jetpack Webkit قابلیت‌های کلاس استاندارد WebView را افزایش می‌دهد، اما به طور کامل جایگزین کلاس اصلی WebView نمی‌شود.

شما می‌توانید به استفاده از کلاس android.webkit.WebView ادامه دهید. می‌توانید آن را به طرح‌بندی‌های XML خود اضافه کنید و در کد خود به نمونه آن ارجاع دهید. برای دسترسی به ویژگی‌های استاندارد چارچوب، همچنان می‌توانید متدها را مستقیماً در نمونه WebView یا شیء تنظیمات آن فراخوانی کنید.

برای دسترسی به ویژگی‌های مدرن، از متدهای کمکی استاتیک ارائه شده توسط Jetpack Webkit، مانند WebViewCompat و WebSettingsCompat ، استفاده می‌کنید. شما نمونه WebView موجود خود را به این متدها ارسال می‌کنید.

کاتلین

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.14.0"
}

کاتلین

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

Jetpack Webkit شامل wrapper های نازکی است، بنابراین تأثیر آن بر اندازه برنامه شما حداقل است.

مرحله ۲: الگوی تشخیص ویژگی را اتخاذ کنید

برای جلوگیری از خرابی هنگام فراخوانی APIهای غیرقابل دسترس، از بررسی ویژگی‌ها استفاده کنید. توصیه می‌کنیم هر فراخوانی API را با یک بررسی ویژگی احاطه کنید و در صورت امکان، منطق بازگشتی را برای زمانی که API در دسترس نیست در نظر بگیرید.

ما الگوی زیر را برای استفاده از یک WebView API مدرن توصیه می‌کنیم:

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

// In your Kotlin code where you configure your WebView
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.
}

این الگو به تضمین پایداری برنامه کمک می‌کند. از آنجا که بررسی ویژگی ابتدا اجرا می‌شود، در صورت عدم وجود ویژگی، برنامه از کار نمی‌افتد. سربار عملکرد بررسی WebViewFeature#isFeatureSupported() ناچیز است.