تطبيقات الويب التقدمية
تثبيت التطبيق (إضافة إلى الشاشة الرئيسية)
تثبيت التطبيق وإضافة إلى الشاشة الرئيسية
واحدة من الميزات المميزة لتطبيقات الويب التقدمية هي القدرة على تثبيتها على جهاز المستخدم، مما يوفر تجربة تشبه التطبيق يتم تشغيلها من الشاشة الرئيسية. يغطي هذا الدرس كيفية تنفيذ وتخصيص تجربة التثبيت.
معايير التثبيت
قبل أن يمكن تثبيت تطبيق الويب التقدمي، يجب أن يستوفي متطلبات معينة:
متطلبات التثبيت:
- HTTPS: يتم تقديمه عبر اتصال آمن (باستثناء localhost)
- بيان تطبيق الويب: ملف manifest.json صالح مع الحقول المطلوبة
- عامل الخدمة: عامل خدمة مسجل يتعامل مع أحداث الجلب
- الرموز: رمز واحد على الأقل (192x192 أو أكبر)
- تفاعل المستخدم: تفاعل المستخدم مع الموقع (Chrome فقط)
حدث beforeinstallprompt
التقط مطالبة التثبيت واعرضها في الوقت المناسب:
let deferredPrompt;
let installButton;
window.addEventListener('beforeinstallprompt', (event) => {
// منع مطالبة التثبيت الافتراضية
event.preventDefault();
// تخزين الحدث للاستخدام لاحقًا
deferredPrompt = event;
// إظهار زر التثبيت المخصص
installButton = document.getElementById('install-button');
if (installButton) {
installButton.style.display = 'block';
}
console.log('مطالبة التثبيت متاحة');
});
// التعامل مع نقرة زر التثبيت
if (installButton) {
installButton.addEventListener('click', async () => {
if (!deferredPrompt) {
console.log('مطالبة التثبيت غير متاحة');
return;
}
// إظهار مطالبة التثبيت
deferredPrompt.prompt();
// انتظار استجابة المستخدم
const { outcome } = await deferredPrompt.userChoice;
console.log(`استجابة المستخدم: ${outcome}`);
if (outcome === 'accepted') {
console.log('قبل المستخدم مطالبة التثبيت');
} else {
console.log('رفض المستخدم مطالبة التثبيت');
}
// مسح المطالبة المؤجلة
deferredPrompt = null;
// إخفاء زر التثبيت
installButton.style.display = 'none';
});
}
أفضل الممارسات لمطالبات التثبيت:
- انتظر تفاعل المستخدم قبل إظهار المطالبة
- قدم سياقًا حول سبب كون التثبيت مفيدًا
- اجعل زر التثبيت جذابًا بصريًا ولكن غير متطفل
- لا تظهر المطالبة على الفور عند تحميل الصفحة
- احترم المستخدمين الذين يرفضون المطالبة
واجهة مستخدم تثبيت مخصصة
أنشئ مطالبة تثبيت مخصصة تتناسب مع تصميم تطبيقك:
<!-- شريط تثبيت مخصص -->
<div id="install-banner" class="install-banner" style="display: none;">
<div class="banner-content">
<img src="/icon-192x192.png" alt="أيقونة التطبيق" class="banner-icon">
<div class="banner-text">
<h3>ثبت تطبيقنا</h3>
<p>احصل على وصول سريع واعمل دون اتصال</p>
</div>
<div class="banner-actions">
<button id="install-accept" class="btn-primary">تثبيت</button>
<button id="install-dismiss" class="btn-secondary">ليس الآن</button>
</div>
</div>
</div>
<script>
let deferredPrompt;
const installBanner = document.getElementById('install-banner');
const installAccept = document.getElementById('install-accept');
const installDismiss = document.getElementById('install-dismiss');
window.addEventListener('beforeinstallprompt', (event) => {
event.preventDefault();
deferredPrompt = event;
// إظهار الشريط بعد 30 ثانية من التفاعل
setTimeout(() => {
if (installBanner) {
installBanner.style.display = 'block';
}
}, 30000);
});
installAccept?.addEventListener('click', async () => {
if (deferredPrompt) {
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
console.log(`نتيجة التثبيت: ${outcome}`);
deferredPrompt = null;
}
installBanner.style.display = 'none';
});
installDismiss?.addEventListener('click', () => {
installBanner.style.display = 'none';
// تذكر الرفض لمدة 7 أيام
localStorage.setItem('install-dismissed', Date.now() + (7 * 24 * 60 * 60 * 1000));
});
</script>
تتبع التثبيت
راقب متى يقوم المستخدمون بتثبيت تطبيق الويب التقدمي الخاص بك وكيف يقومون بتشغيله:
// تتبع عند تثبيت التطبيق
window.addEventListener('appinstalled', (event) => {
console.log('تم تثبيت PWA');
// إرسال حدث التحليلات
if (window.gtag) {
gtag('event', 'pwa_install', {
method: 'browser_prompt'
});
}
// إخفاء أي مطالبات تثبيت
const installButton = document.getElementById('install-button');
if (installButton) {
installButton.style.display = 'none';
}
});
// اكتشاف كيفية تشغيل التطبيق
function detectLaunchMode() {
const isStandalone = window.matchMedia('(display-mode: standalone)').matches;
const isInWebAppiOS = (window.navigator.standalone === true);
if (isStandalone || isInWebAppiOS) {
console.log('تم التشغيل كـ PWA مثبت');
if (window.gtag) {
gtag('event', 'pwa_launch', {
display_mode: 'standalone'
});
}
} else {
console.log('تم التشغيل في المتصفح');
}
}
detectLaunchMode();
اختصارات التطبيق
حدد اختصارات التطبيق في بيانك لتوفير وصول سريع إلى الميزات الرئيسية:
{
"name": "تطبيقي PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"shortcuts": [
{
"name": "رسالة جديدة",
"short_name": "رسالة",
"description": "إنشاء رسالة جديدة",
"url": "/messages/new",
"icons": [
{
"src": "/images/shortcut-message.png",
"sizes": "192x192",
"type": "image/png"
}
]
},
{
"name": "الإعدادات",
"short_name": "إعدادات",
"description": "فتح إعدادات التطبيق",
"url": "/settings",
"icons": [
{
"src": "/images/shortcut-settings.png",
"sizes": "192x192",
"type": "image/png"
}
]
}
]
}
قيود المنصة: اختصارات التطبيق مدعومة حاليًا على Android و Windows، ولكن ليس على iOS. اختبر دائمًا على المنصات المستهدفة.
شارات التطبيق
قم بتحديث شارة رمز التطبيق لإظهار عدد الإشعارات أو الحالة:
// تعيين عدد الشارة
if ('setAppBadge' in navigator) {
navigator.setAppBadge(5); // يظهر "5" على رمز التطبيق
}
// مسح الشارة
if ('clearAppBadge' in navigator) {
navigator.clearAppBadge();
}
// تحديث الشارة عند تلقي الإشعارات
self.addEventListener('push', async (event) => {
const data = event.data.json();
// إظهار الإشعار
await self.registration.showNotification(data.title, {
body: data.body,
icon: '/images/icon-192x192.png'
});
// تحديث عدد الشارة
const unreadCount = await getUnreadCount();
if ('setAppBadge' in navigator) {
navigator.setAppBadge(unreadCount);
}
});
تمرين:
- نفذ معالج حدث beforeinstallprompt
- أنشئ زر تثبيت مخصص مع نص ترويجي
- تتبع أحداث التثبيت باستخدام التحليلات
- أضف اختصارات التطبيق إلى بيانك للميزات الرئيسية
- نفذ إشعارات الشارة لعدد غير المقروء
- اختبر تدفق التثبيت على أجهزة مختلفة