חנויות אפליקציות מספקות למפתחים מקום להציג את האפליקציות שלהם לפני ההתקנה, עם צילומי מסך וטקסטים שעוזרים למשתמש לבחור אם להתקין את האפליקציה. ממשק משתמש עשיר יותר של התקנה מספק למפתחים של אפליקציות אינטרנט מרחב דומה שבו יכולים להזמין את המשתמשים להתקין את האפליקציה שלהם, ישירות מהדפדפן. ממשק המשתמש המשופר הזה זמין ב-Chrome לסביבות של Android ושל מחשבים.
בקשת ברירת המחדל
בדוגמה שבהמשך אפשר לראות את חוויית ברירת המחדל, שלא כוללת מספיק הקשר.
ממשק משתמש עשיר יותר להתקנה
כדי להשתמש בתיבת הדו-שיח 'התקנה עשירה יותר' במקום בהנחיית ברירת המחדל הקטנה הרגילה, צריך להוסיף את השדות screenshots
ו-description
למניפסט האינטרנט. דוגמה ל-Squoosh.app:
תיבת הדו-שיח של ממשק המשתמש להתקנה עשירה יותר מורכבת מהתוכן של השדות description
ו-screenshots
במניפסט האינטרנט.
כדי להפעיל את תיבת הדו-שיח, צריך רק להוסיף צילום מסך אחד לפחות של גורם הצורה המתאים, אבל מומלץ להוסיף גם את התיאור. כדאי לעיין בפרטים ספציפיים לגבי השדות האלה בהמשך.
צילומי מסך
צילומי המסך באמת יוסיפו מידע 'עשיר יותר' חלק מממשק המשתמש של ההתקנה החדש, ואנחנו ממליצים מאוד להשתמש בו. במניפסט מוסיפים את החבר screenshots
, שמקבל מערך שדורש לפחות תמונה אחת ו-Chrome יציג עד שמונה תמונות. למטה מוצגת דוגמה.
"screenshots": [
{
"src": "source/image1.png",
"sizes": "640x320",
"type": "image/png",
"form_factor": "wide",
"label": "Wonder Widgets"
}
]
צילומי המסך חייבים לעמוד בקריטריונים הבאים:
- הרוחב והגובה צריכים להיות לפחות 320 פיקסלים, ולא יותר מ-3,840 פיקסלים.
- המאפיין המקסימלי לא יכול להיות גדול מפי 2.3 מהמאפיין המינימלי.
- לכל צילומי המסך עם אותו גורם צורה צריך להיות יחס גובה-רוחב זהה.
- אפשר להעלות תמונות רק בפורמט JPEG ו-PNG.
- יוצגו רק שמונה צילומי מסך. אם מוסיפים עוד פרטים, סוכן המשתמש פשוט מתעלם מהם.
בנוסף, צריך לציין את הגודל והסוג של התמונה כדי שהיא תיראה כמו שצריך. לצפייה בהדגמה הזו
הערך form_factor
מציין לדפדפן אם צילום המסך צריך להופיע במחשבים (wide
) או בסביבות של מכשירים ניידים (narrow
).
תיאור
החבר description
מתאר את האפליקציה בבקשת ההתקנה, כדי להזמין את המשתמש להשאיר אותה.
תיבת הדו-שיח תוצג גם בלי description
, אבל מומלץ לעשות זאת.
אפשר להזין עד 7 שורות טקסט (בערך 324 תווים), ותיאורים ארוכים יותר נחתכים ומוצמדת שלוש נקודות (כפי שאפשר לראות בדוגמה הזו).
{
…
"description": "Compress and compare images with different codecs
right in your browser."
}
התיאור יופיע בחלק העליון של בקשת ההתקנה.
ייתכן שהבחנתם בצילומי המסך שבתיבות הדו-שיח של ההתקנה מפורטות גם מקור האפליקציה. מקורות שאורכם מדי ולא מתאימים לממשק המשתמש ייחתכו, התהליך הזה נקרא גם eliding, ונעשה בו שימוש כאמצעי אבטחה להגנה על המשתמשים.
קריאה נוספת
הדגמה (דמו)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark light" />
<link rel="manifest" href="manifest.json" />
<title>How to add Richer Install UI to your web app</title>
<!-- TODO: Devsite - Removed inline handlers -->
<!-- <script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js');
});
}
</script>
<script type="module" src="script.js"></script> -->
</head>
<body>
<h1>How to add Richer Install UI to your web app</h1>
<ol>
<li>
Install the app by clicking the button below. After the installation,
the button is disabled.
<p>
<button disabled type="button">Install</button>
</p>
</li>
<li>
When you click on install a dialog similar to the ones from app stores
will be displayed.
</li>
<li>
The dialog includes the `description` and `screenshots` set in the app
manifest.
</li>
<li>
Screenshots should be different depending if the app is being installed
on a mobile or desktop device, according to the `form_factor` value set
for the screenshots on the manifest
</li>
</ol>
</body>
</html>
// The install button.
const installButton = document.querySelector('button');
// Only relevant for browsers that support installation.
if ('BeforeInstallPromptEvent' in window) {
// Variable to stash the `BeforeInstallPromptEvent`.
let installEvent = null;
// Function that will be run when the app is installed.
const onInstall = () => {
// Disable the install button.
installButton.disabled = true;
// No longer needed.
installEvent = null;
};
window.addEventListener('beforeinstallprompt', (event) => {
// Do not show the install prompt quite yet.
event.preventDefault();
// Stash the `BeforeInstallPromptEvent` for later.
installEvent = event;
// Enable the install button.
installButton.disabled = false;
});
installButton.addEventListener('click', async () => {
// If there is no stashed `BeforeInstallPromptEvent`, return.
if (!installEvent) {
return;
}
// Use the stashed `BeforeInstallPromptEvent` to prompt the user.
installEvent.prompt();
const result = await installEvent.userChoice;
// If the user installs the app, run `onInstall()`.
if (result.outcome === 'accepted') {
onInstall();
}
});
// The user can decide to ignore the install button
// and just use the browser prompt directly. In this case
// likewise run `onInstall()`.
window.addEventListener('appinstalled', () => {
onInstall();
});
}