يتم رفض المنبّهات الدقيقة المحدَّدة تلقائيًا.

المنبّهات المحددة هي الإشعارات التي يجريها المستخدم أو الإجراءات التي يجب أن تحدث في وقت دقيق.

SCHEDULE_EXACT_ALARM هو الإذن الذي تم تقديمه في نظام التشغيل Android 12 للتطبيقات لتحديد مواعيد المنبّهات المحدّدة الوقت، لم يعد يتم منحه مسبقًا لمعظم التطبيقات المثبّتة حديثًا التي تستهدف الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث (سيتم ضبطه على "رفض" تلقائيًا). في حال نقل المستخدم بيانات التطبيق إلى جهاز يعمل بالإصدار 14 من نظام التشغيل Android من خلال عملية النسخ الاحتياطي والاستعادة، سيستمر رفض الإذن. إذا كان التطبيق الحالي حاصلاً على هذا الإذن، سيتم منحه مسبقًا عند ترقية الجهاز إلى Android 14.

يجب الحصول على إذن SCHEDULE_EXACT_ALARM لبدء المنبّهات المحدَّدة الوقت من خلال واجهات برمجة التطبيقات التالية، وإلا سيتم طرح SecurityException:

لا تزال أفضل الممارسات الحالية لإذن SCHEDULE_EXACT_ALARM سارية، بما في ذلك ما يلي:

التطبيقات المتأثِّرة

إذا كان الجهاز يعمل بنظام التشغيل Android 14 أو إصدار أحدث، سيؤثر هذا التغيير في تطبيق تم تثبيته حديثًا وفيه الخصائص التالية:

  • يستهدف Android 13 (المستوى 33 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث.
  • يوضِّح إذن SCHEDULE_EXACT_ALARM في البيان.
  • لا يندرج تحت سيناريو الإعفاء أو المنح المسبق
  • ليس تطبيق تقويم أو منبه.

يجب أن تعرض تطبيقات التقويم والمنبّهة معلومات عن USE_EXACT_ALARM.

تحتاج تطبيقات التقويم أو المنبّهات إلى إرسال تذكيرات في التقويم أو منبّهات الاستيقاظ أو تنبيهات عندما يتوقف تشغيل هذه التطبيقات. يمكن لهذه التطبيقات طلب إذن USE_EXACT_ALARM العادي. سيتم منح إذن "USE_EXACT_ALARM" عند التثبيت، وستتمكّن التطبيقات التي لديها هذا الإذن من ضبط منبّهات دقيقة، تمامًا مثل التطبيقات التي لديها إذن SCHEDULE_EXACT_ALARM.

حالات الاستخدام التي قد لا تتطلب منبّهات دقيقة

بما أنّه يتم الآن رفض إذن SCHEDULE_EXACT_ALARM تلقائيًا وتتطلب عملية منح الإذن من المستخدمين اتخاذ خطوات إضافية، ننصح المطوّرين بشدة بتقييم حالات الاستخدام وتحديد ما إذا كانت المنبّهات المحدَّدة الوقت لا تزال مفيدة لحالات الاستخدام لديهم.

تعرض القائمة التالية عمليات سير العمل الشائعة التي قد لا تتطلب منبّهًا دقيقًا:

جدولة العمل المتكرر خلال عمر تطبيقك
يمكن الاستفادة من طريقة set() إذا كانت المهمة بحاجة إلى وضع قيود الوقت الفعلي في الاعتبار، مثل الانطلاق في الساعة 2:00 بعد الظهر غدًا أو بعد 30 دقيقة. وفي الحالات الأخرى، ننصحك باستخدام إحدى الطريقتَين postAtTime() أو postDelayed() بدلاً من ذلك.
العمل المُجدوَل في الخلفية، مثل تحديث التطبيق وتحميل السجلات
يوفّر WorkManager طريقة لجدولة العمل الدوري الحسّاس لتوقيت نقاط الاتصال. يمكنك توفير فاصل زمني للتكرار وميزة flexInterval (بحد أدنى 15 دقيقة) لتحديد وقت التشغيل الدقيق للعمل.
مطلوب إطلاق المنبّه في الوقت التقريبي عندما يكون النظام في حالة عدم النشاط
يُرجى استخدام منبّه غير دقيق. على وجه التحديد، يمكنك طلب setAndAllowWhileIdle().
إجراء من تحديد المستخدم يجب أن يحدث بعد وقت محدد
يُرجى استخدام منبّه غير دقيق. على وجه التحديد، يمكنك طلب set().
إجراء من تحديد المستخدم يمكن أن يحدث خلال فترة زمنية
يُرجى استخدام منبّه غير دقيق. على وجه التحديد، يمكنك طلب setWindow(). تجدر الإشارة إلى أنّ أقل طول نافذة مسموح به هو 10 دقائق.

خطوات نقل البيانات لمواصلة استخدام المنبّهات المحدَّدة الوقت

على الأقل، يجب أن تتحقّق التطبيقات لمعرفة ما إذا كان لديها إذن قبل جدولة المنبّهات المحدَّدة الوقت. إذا لم يكن لدى التطبيقات الإذن، يجب أن تطلبه من المستخدم من خلال استدعاء هدف.

ويشبه ذلك سير العمل العادي لطلب إذن خاص:

  1. يجب أن تتصل التطبيقات بالرقم AlarmManager.canScheduleExactAlarms() للتأكّد من حصولها على الإذن المناسب.
  2. إذا لم يكن التطبيق حاصلاً على الإذن، استدعِ الغرض الذي يتضمّن ACTION_REQUEST_SCHEDULE_EXACT_ALARM، بالإضافة إلى اسم حزمة التطبيق، لطلب منح المستخدمين الإذن.

    يمكنك التحقق من قرار المستخدم من خلال طريقة onResume() في تطبيقك.

  3. استمع إلى عمليات بث AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED التي يتم إرسالها إذا منح المستخدم الإذن.

  4. وفي حال منح المستخدم الإذن لتطبيقك، يمكن لتطبيقك ضبط المنبّهات المحدَّدة الوقت. أما إذا رفض المستخدم منح الإذن بدلاً من ذلك، فيمكنك خفض مستوى تجربة التطبيق على نحو لائق بحيث يوفّر وظائف للمستخدم بدون الحصول على المعلومات المحمية بهذا الإذن.

يوضّح مقتطف الرمز التالي كيفية التحقّق من إذن SCHEDULE_EXACT_ALARM:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

رمز نموذجي للتحقق من الإذن والتعامل مع قرارات المستخدم في onResume():

override fun onResume() {
   …  
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

التقليل إلى حدٍ كبير عند رفض الإذن

يرفض بعض المستخدمين منح الإذن. في هذا السيناريو، ننصح التطبيقات بخفض مستوى التجربة بشكل سلس، مع الاستمرار في السعي لتوفير أفضل تجربة احتياطية ممكنة للمستخدم من خلال تحديد حالات الاستخدام الخاصة بها.

الإعفاءات

يُسمَح دائمًا للأنواع التالية من التطبيقات بطلب الإجراء setExact() أو setExactAndAllowWhileIdle():

  • التطبيقات الموقَّعة باستخدام شهادة النظام الأساسي
  • التطبيقات المميزة:
  • التطبيقات المُدرَجة في القائمة المسموح بها للطاقة (إذا كان تطبيقك يستوفي المتطلبات، يمكنك طلب ذلك باستخدام إجراء الغرض من ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).

المنح المُسبَقة

إرشادات بشأن إجراء الفحوصات

لاختبار هذا التغيير، يجب إيقاف إذن المنبّهات والتذكيرات لتطبيقك من صفحة أذونات خاصة للتطبيقات في إعدادات النظام (الإعدادات > التطبيقات > أذونات خاصة للتطبيقات > المنبّهات والتذكيرات) ومراقبة سلوك تطبيقك.