الحلقة 6: إدارة وإلغاء الإشعارات المجدولة
جدولة الإشعار هي مجرد البداية. في التطبيقات الاحترافية، يجب أن تكون قادراً على مراجعة وتحديث وسحب الإشعارات بناءً على إجراءات المستخدم. إذا قام مستخدم بحذف مهمة، فلا ينبغي لهاتفه أن يهتز بعد 10 دقائق لنفس تلك المهمة المحذوفة.
في هذا الدرس، سنتعلم كيفية:
- مراجعة الطابور: استرداد جميع الإشعارات المجدولة حالياً.
- الإلغاء المستهدف: إزالة إشعارات محددة باستخدام معرفاتها (IDs).
- خيار "المسح الشامل": مسح جميع التنبيهات المجدولة دفعة واحدة.
- إدارة التنبيهات المعروضة: إغلاق الإشعارات الموجودة بالفعل في قائمة التنبيهات برمجياً.
1. مراجعة طابور الإشعارات
قبل أن تتمكن من إدارة إشعاراتك، تحتاج إلى رؤية ما هو موجود حالياً "في الطريق". يوفر إكسبو الدالة getAllScheduledNotificationsAsync التي تعيد مصفوفة من جميع التنبيهات المعلقة التي لم يحن موعد انطلاقها بعد.
index.tstypescriptimport * as Notifications from 'expo-notifications'; const auditQueue = async () => { const scheduled = await Notifications.getAllScheduledNotificationsAsync(); console.log(`يوجد ${scheduled.length} إشعار في الطابور.`); scheduled.forEach(notif => { console.log(`[ID: ${notif.identifier}] العنوان: ${notif.content.title}`); }); };
هذا مفيد جداً للتصحيح (Debugging) ولإنشاء شاشات "إدارة التذكيرات" داخل تطبيقك.
2. الإلغاء المستهدف
لإلغاء إشعار محدد، يجب أن تكون قد حفظت معرفه (identifier) عندما تم جدولته لأول مرة.
“[!IMPORTANT] قم دائماً بتخزين معرفات الإشعارات في قاعدة بياناتك (SQLite أو AsyncStorage أو backend) بجانب البيانات ذات الصلة (مثل معرف المهمة Task ID). هذه هي الطريقة الوحيدة لربط إجراء المستخدم (مثل "حذف المهمة") بالتنبيه المجدول لها.
index.tstypescriptconst cancelTaskReminder = async (notificationId: string) => { await Notifications.cancelScheduledNotificationAsync(notificationId); console.log(`تم سحب الإشعار رقم ${notificationId} بنجاح.`); };
3. استراتيجية "المسح الشامل"
هناك حالات تريد فيها البدء من جديد — مثل عندما يقوم المستخدم بتسجيل الخروج أو إيقاف جميع التذكيرات من الإعدادات.
index.tstypescriptconst deactivateAllReminders = async () => { await Notifications.cancelAllScheduledNotificationsAsync(); // تقديم ملاحظة للمستخدم في الواجهة };
استخدم هذا الخيار بحذر، لأنه سيحذف كل إشعار معلق لتطبيقك، بما في ذلك تلك التي قد لا يزال المستخدم يتوقعها.
4. إغلاق الإشعارات التي وصلت بالفعل
أحياناً، يكون الإشعار قد انطلق بالفعل وهو موجود في قائمة الإشعارات بهاتف المستخدم. إذا فتح المستخدم التطبيق وأكمل المهمة، فإن تلك الإشعارات القديمة تصبح غير ضرورية. يمكنك تنظيفها برمجياً.
index.tstypescript// مسح جميع الإشعارات المعروضة حالياً في قائمة التنبيهات await Notifications.dismissAllNotificationsAsync(); // مسح إشعار معروض محدد await Notifications.dismissNotificationAsync(id);
في نظام Android، هذه ميزة قوية جداً للحفاظ على شريط الحالة لدى المستخدم نظيفاً وذا صلة.
التكامل مع مخزن البيانات الخاص بك
الطريقة الأكثر احترافية للتعامل مع هذا هي إنشاء دالة وسيطة تتعامل مع تحديث البيانات ومنطق الإشعارات معاً:
index.tstypescriptasync function deleteAndCancelTask(taskId: string, notificationId: string) { // 1. الحذف من قاعدة البيانات await db.tasks.delete(taskId); // 2. إلغاء التنبيه المجدول if (notificationId) { await Notifications.cancelScheduledNotificationAsync(notificationId); } }
التحدي الخاص بك
قم بتنفيذ زر "مراجعة" (Audit) في مشروعك يقوم بطباعة جميع الإشعارات المعلقة. ثم جرب جدولة 3 إشعارات وإلغاء الإشعار الأوسط باستخدام معرفه (ID). تأكد من بقاء 2 فقط في الطابور.