يمكن أن تفقد إشعارات iOS الإذن بالإرسال إذا تم كتم الإشعار. تمت تهيئة رمز Discourse لكتم الإشعارات اختياريًا، وبالتالي سيفقد الإذن بالإرسال عند حدوث ذلك ثلاث مرات.
إليك الرمز الخاص بعامل خدمة الإشعارات الفورية.
يحتوي هذا الرمز على خطأ فادح فيه، في السطر 178. هناك، يتحقق عامل الخدمة مما إذا كان المستخدم نشطًا (أي ليس خاملاً). في هذه الحالة، يعيد حدث الدفع قيمة false دون عرض إشعار.
(كما يتحقق من payload.hide_when_active، ولكن تبين أن hide_when_active هو دائمًا صحيح، وبالتالي يعيد هذا الرمز دائمًا قيمة false عندما يكون المستخدم نشطًا.)
تمنع Apple عمليات الدفع الصامتة، وتسحب إذن الدفع بعد ثلاث أحداث لا تعرض إشعارات
هذا غير مقبول بموجب قواعد Apple للإشعارات الفورية.
https://webkit.org/blog/12945/meet-web-push/
الطاقة والخصوصية
يعامل كل من مشروع المصدر المفتوح WebKit و Apple الخصوصية كحق أساسي من حقوق الإنسان. كما هو الحال مع الميزات الأخرى ذات الامتيازات في منصة الويب، يتطلب طلب اشتراك الدفع إيماءة صريحة من المستخدم. كما يتطلب منك تعيين علامة
userVisibleOnlyإلى true، والوفاء بهذا الوعد من خلال عرض إشعار دائمًا استجابةً لرسالة الدفع.واجهة برمجة تطبيقات Web Push ليست دعوة لتشغيل وقت تشغيل الخلفية الصامت، لأن ذلك من شأنه أن ينتهك ثقة المستخدم ويؤثر على عمر بطارية المستخدم.
سيؤدي انتهاك وعد
userVisibleOnlyإلى إلغاء اشتراك الدفع.
(التأكيد لي)
تم شرح ذلك بمزيد من التفصيل في فيديو WWDC الخاص بـ Apple حول Web Pushes، في الدقيقة 9:57
https://developer.apple.com/videos/play/wwdc2022/10098/?time=596
لاحظ أننا نذكر صراحةً أننا نعد دائمًا بجعل عمليات الدفع مرئية للمستخدم. بينما تستوعب معايير واجهة برمجة تطبيقات JavaScript Push اختياريًا تشغيل وقت تشغيل الخلفية الصامت استجابةً لعملية دفع، فإن معظم المتصفحات لا تدعم ذلك. Safari لا تدعم ذلك.
… ثم في الدقيقة 13:35:
https://developer.apple.com/videos/play/wwdc2022/10098/?time=814
كما ذكرت عندما أريتك الرمز الخاص بكيفية طلب اشتراك الدفع، يجب أن تعد بأن عمليات الدفع ستكون مرئية للمستخدم. التعامل مع حدث الدفع ليس دعوة لبرنامج JavaScript الخاص بك للحصول على تشغيل وقت تشغيل الخلفية الصامت. القيام بذلك من شأنه أن ينتهك ثقة المستخدم وعمر بطارية المستخدم. عند التعامل مع حدث الدفع، يجب عليك في الواقع نشر إشعار في مركز الإشعارات. تمتلك المتصفحات الأخرى جميع الإجراءات المضادة ضد انتهاك الوعد بجعل عمليات الدفع مرئية للمستخدم، وكذلك Safari. في الإصدار التجريبي من macOS Ventura، بعد ثلاث أحداث دفع تفشل فيها في نشر إشعار في الوقت المناسب، سيتم إلغاء اشتراك الدفع الخاص بموقعك. ستحتاج إلى المرور عبر سير عمل الإذن مرة أخرى.
(التأكيد لي)
توصي Apple بعرض الإشعارات فورًا، وليس بعد إغلاق الإشعارات
يبدو الرمز الموصى به من Apple كما يلي، في الدقيقة 11:39:
https://developer.apple.com/videos/play/wwdc2022/10098/?time=699
self.addEventListener('push', (event) => {
let pushMessageJSON = event.data.json();
// يضع خادمنا كل ما هو ضروري لعرض الإشعار
// في بيانات JSON الخاصة بنا.
event.waitUntil(self.registration.showNotification(pushMessageJSON.title, {
body: pushMessageJSON.body,
tag: pushMessageJSON.tag,
actions: [{
action: pushMessageJSON.actionURL,
title: pushMessageJSON.actionTitle,
}]
}));
}
تذكر كيف وعد برنامج JavaScript الخاص بنا، عندما اشتركنا في الدفع، بأنها ستكون دائمًا مرئية للمستخدم؟ هذا يعني أنه يجب علينا دائمًا عرض إشعار أصلي للمنصة استجابةً لكل عملية دفع. من الأفضل القيام بذلك في أقرب وقت ممكن في معالج حدث الدفع الخاص بك.
لا يتبع رمز Discourse أفضل الممارسات الموصى بها. يقوم رمز Discourse أولاً بإغلاق جميع الإشعارات، ثم يعرض إشعارًا.
يجب على Discourse دائمًا استدعاء showNotification استجابةً لحدث الدفع، ويجب عليه دائمًا القيام بذلك في أقرب وقت ممكن.