توفّر متاجر التطبيقات مساحة للمطوّرين لعرض تطبيقاتهم قبل التثبيت، مع لقطات شاشة ومعلومات نصية تساعد المستخدم في اختيار تثبيت التطبيق. توفر واجهة مستخدم أكثر ثراءً مساحة مماثلة لمطوِّري تطبيقات الويب لدعوة المستخدمين إلى تثبيت تطبيقاتهم مباشرةً من المتصفح. وتتوفّر واجهة المستخدم المحسَّنة هذه في بيئات Chrome لأجهزة Android وأجهزة الكمبيوتر المكتبي.
الطلب التلقائي
اطّلِع على المثال أدناه لمعرفة التجربة التلقائية التي لا توفّر سياقًا كافيًا.
واجهة مستخدم أكثر ثراءً للتثبيت
للحصول على مربّع حوار لواجهة المستخدم Richer Install بدلاً من الطلب التلقائي الصغير العادي، أضِف حقلَي 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."
}
يظهر الوصف في أعلى طلب التثبيت.
ربما لاحظت من لقطات الشاشة أنّ مربّعات حوار التثبيت تسرد أيضًا مصدر التطبيق. يتم اقتطاع المصادر التي تكون طويلة جدًا والتي لا تتناسب مع واجهة المستخدم، ويُعرَف هذا أيضًا باسم الانتهاء ويُستخدَم كـ إجراء أمني لحماية المستخدمين.
محتوى إضافي للقراءة
- واجهة مستخدم محسّنة لتثبيت تطبيق الويب التقدّمي (PWA)
- توفُّر واجهة مستخدم أكثر ثراءً لتثبيت التطبيق على أجهزة الكمبيوتر المكتبي
عرض توضيحي
<!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();
});
}