פיתוח פשוט יותר של WebView עם Jetpack Webkit

במדריך הזה אנחנו מתארים את היתרונות של ספריית Jetpack Webkit, מסבירים איך היא פועלת ואיך אפשר להטמיע אותה בפרויקטים שלכם.

סקירה כללית

רכיבי WebView הם חלק חיוני בפיתוח ל-Android, אבל לפעמים קשה לנהל אותם בגלל חוסר עקביות בתכונות בגרסאות שונות של מערכת ההפעלה Android. כל גרסה של Android OS מספקת קבוצה קבועה של ממשקי API של WebView. מכיוון ש-Android מופץ בקצב איטי יותר מ-WebView, יכול להיות שממשקי ה-API של Android לא יכללו את כל התכונות הזמינות של WebView. התוצאה היא השקה איטית יותר של תכונות ועלויות בדיקה גבוהות יותר.

‫Jetpack Webkit פותר את הבעיות האלה על ידי פעולה כשכבת תאימות ושימוש ב-APK העדכני של WebView במכשיר של המשתמש. היא כוללת גם ממשקי API חדשים ומודרניים שזמינים באופן בלעדי בספרייה הזו.

למה כדאי להשתמש ב-Jetpack Webkit?

בנוסף לתאימות בין גרסאות, Jetpack Webkit מציע גם ממשקי API חדשים ומודרניים שיכולים לפשט את הפיתוח ולשפר את הפונקציונליות של האפליקציה:

  • הפעלת אימות מודרני: WebView יכול לטפל בצורה חלקה בסטנדרטים מודרניים של אימות באינטרנט כמו WebAuthn, וכך לאפשר כניסה באמצעות מפתחות גישה. ספריית androidx.webkit מאפשרת לכם שליטה מלאה בשילוב הזה באמצעות השיטה WebSettingsCompat.setWebAuthenticationSupport(), שבה תוכלו להשתמש כדי להגדיר את רמת התמיכה שהאפליקציה שלכם דורשת.

  • שיפור הביצועים: אפשר לשפר את הביצועים של WebView לתרחישי השימוש באפליקציה באמצעות ממשקי API כמו prefetchUrlAsync,‏ prerenderUrlAsync ו-setBackForwardCacheEnabled.

  • שיפור היציבות: שחזור תהליכי עיבוד שנתקעו או לא מגיבים בלי לגרום לקריסה. מידע נוסף זמין במאמר WebViewRenderProcess#terminate().

  • שליטה מפורטת בנתוני הגלישה: כדי למחוק נתוני גלישה שמאוחסנים ב-WebView ממקורות ספציפיים, משתמשים במחלקה WebStorageCompat.

הסבר על הרכיבים

כדי להשתמש ביעילות ב-Jetpack Webkit, צריך להבין את הקשר בין הרכיבים הבאים:

  • Android System WebView: זהו מנוע העיבוד הגרפי שמבוסס על Chromium ו-Google מעדכנת אותו באופן קבוע דרך חנות Google Play, באותו קצב כמו Chrome. הוא מכיל את התכונות העדכניות ביותר ומספק את קוד ההטמעה הבסיסי לכל ממשקי ה-API של WebView.

  • Framework APIs (android.webkit): אלה ממשקי ה-API שקבועים לגרסה ספציפית של מערכת ההפעלה Android. לדוגמה, אפליקציה ב-Android 10 יכולה לגשת רק לממשקי ה-API שהיו זמינים כשהגרסה הזו הושקה. לכן, אי אפשר להשתמש בתכונות חדשות שנוספו ל-APK של WebView בעדכונים חדשים יותר. לדוגמה, כדי להשתמש ב-WebView#getWebViewRenderProcess() כדי לקבל גישה לרכיב עיבוד שלא מגיב, אפשר להפעיל את הפקודה הזו רק ב-Android מגרסה 10 ואילך.

  • Jetpack Webkit Library (androidx.webkit): זוהי ספריה קטנה שכלולה באפליקציה. הספרייה הזו משמשת כגשר שמבצע קריאה ל-APK של WebView, במקום לבצע קריאה לממשקי ה-API שמוגדרים בפלטפורמת Android, שיש לה גרסת מערכת הפעלה קבועה. כך, גם אם אפליקציה מותקנת במכשיר עם גרסה ישנה יותר של מערכת הפעלה כמו Android 10, האפליקציה יכולה להשתמש בתכונות האחרונות של WebView. לדוגמה, הפונקציה WebViewCompat.getWebViewRenderProcess() פועלת באופן דומה ל-Framework API, אבל אפשר להפעיל אותה גם בכל גרסאות מערכת ההפעלה לפני Android 10.

אם API זמין גם ב-framework וגם ב-Jetpack Webkit, מומלץ לבחור בגרסת Jetpack Webkit. כך אפשר להבטיח התנהגות עקבית ותאימות למגוון הרחב ביותר של מכשירים.

אינטראקציה בין Jetpack Webkit לבין APK

ממשקי ה-API ב-Jetpack Webkit מיושמים בשני חלקים:

  • Static Jetpack Webkit: הספרייה הסטטית Jetpack Webkit מכילה חלק קטן מהקוד שאחראי להטמעה של ה-API.

  • WebView APK: קובץ ה-APK של WebView מכיל את רוב הקוד.

האפליקציה שלך שולחת קריאה ל-Jetpack Webkit API, ששולח קריאה ל-WebView APK.

אתם שולטים בגרסת Jetpack Webkit באפליקציה, אבל אתם לא יכולים לשלוט בעדכוני ה-APK של WebView במכשירים של המשתמשים. בדרך כלל, לרוב המשתמשים יש גרסאות עדכניות של קובץ ה-APK של WebView, אבל האפליקציה עדיין צריכה להיזהר ולא לקרוא לממשקי API שגרסה מסוימת של קובץ ה-APK של WebView לא תומכת בהם.

בנוסף, Jetpack Webkit מבצע הפשטה כך שלא צריך לבדוק את גרסאות WebView באופן ידני. כדי לדעת אם תכונה מסוימת זמינה, צריך לבדוק את הקבוע שלה. לדוגמה, WebViewFeature.WEB_AUTHENTICATION.

איך הם פועלים יחד

‫Jetpack Webkit מגשר על הפער בין Framework API סטטי לבין WebView APK שמתעדכן לעיתים קרובות. כשמשתמשים ב-Jetpack Webkit API עם דפוס זיהוי התכונות, הספרייה מבצעת בדיקה כדי לראות אם התכונה נתמכת על ידי ה-APK של WebView שמותקן במכשיר של המשתמש. היתרון בכך הוא שלא צריך לבדוק את הגרסה של מערכת ההפעלה (המסגרת) של Android.

אם קובץ ה-APK של WebView הוא גרסה עדכנית מספיק, הספרייה מפעילה את התכונה. אם לא, המערכת מדווחת שהתכונה לא זמינה, וכך מונעת קריסה של האפליקציה ומאפשרת לכם לטפל במצב בצורה חלקה.

השוואה בין Jetpack Webkit לבין ממשקי Framework 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)
}

מידע נוסף מופיע במאמרי העזרה של androidx.webkit.

שילוב של 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)
}

Java

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, פועלים לפי השלבים הבאים.

שלב 1: מוסיפים את התלות

בקובץ build.gradle.kts או build.gradle של המודול, צריך לכלול את התלות הבאה כדי להוסיף את Jetpack Webkit:

מגניב

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

Kotlin

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

‫Jetpack Webkit מכיל עטיפות דקות, כך שההשפעה על גודל האפליקציה מינימלית.

שלב 2: הטמעה של תבנית לזיהוי תכונות

כדי למנוע קריסות כשמפעילים ממשקי 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() זניחה.