iOS 12: الجديد في الإخطارات

تم عقد مؤتمر WWDC ، ولا يزال هناك الكثير من التقارير التي تستحق المشاهدة. كانت هناك مواضيع رئيسية اهتمت Apple بها بشكل خاص. Core ML ، اختصارات Siri ، وبالطبع التغييرات على الإشعارات.



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


لنبدأ بنظرة عامة على الميزات التي أضافتها Apple.


تجميع الإخطار


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


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



لكي لا أفرط في تحميل هذه المواد ، أضع المعلومات في مقالة منفصلة .


التغييرات في NSExtensionContext API


العنصر التالي هو فرص جديدة للإشعارات ، وخاصة فئة NSExtensionContext . وهو مسؤول عن التفاعل مع الحاجيات ، Siri ، تشغيل محتوى الوسائط. نحن مهتمون أكثر بالإخطارات. تم إضافة طريقتين ومتغير واحد:


var notificationActions: [UNNotificationAction] { get set } 

يسمح المتغير باستبدال مجموعة الإجراءات المتاحة أثناء التفاعل مع الإخطار:


 func dismissNotificationContentExtension() func performNotificationDefaultAction() 

طرق فتح التطبيق أو إخفاء الإخطار.


لإثبات الإمكانيات ، سنكتب طلبًا صغيرًا.


أولاً ، أضف إلى التطبيق إرسال إشعارات محلية:


 let actions = [ UNNotificationAction(identifier: "like-action", title: "Like", options: []), UNNotificationAction(identifier: "open-app", title: "Open App", options: []), UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: []), ] let simpleCategory = UNNotificationCategory(identifier: "category-simple", actions: actions, intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([simpleCategory]) 

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

سترسل الطريقة الثانية إخطارًا محليًا بعد فترة زمنية محددة حتى نتمكن من تقليل التطبيق أو قفل الهاتف:


 UNUserNotificationCenter.current().getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = "Cat Title" content.subtitle = "Cat Subtitle" content.body = "Cat Body" content.sound = .default content.categoryIdentifier = "category-simple" let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) let uuid = UUID().uuidString let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in }) } 

  • تحقق مما إذا كان المستخدم سمح لنا بإرسال إشعارات.
  • نقوم بإنشاء إشعار بعنوان ونص ونشير إلى الفئة التي ستنتمي إليها. في هذه الحالة ، "فئة بسيطة".
  • اضبط مشغل الزناد بعد 3 ثوان.
  • املأ طلب إرسال إشعار. في هذه الحالة ، نستخدم UUID كمعرف . قد تكون هناك حاجة إلى هذا المعرف إذا أردنا إلغاء الإخطار المجدول.
  • أضف طلبنا إلى مركز الإعلام.

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



سيتم إنشاء ملف plist و ViewController و Storyboard:



في ملف plist ، نحن مهتمون بالمفاتيح التالية:


  • UNNotificationExtensionCategory - اسم الفئة التي ستتم معالجتها. كما كان من قبل ، حدد "فئة بسيطة".
  • UNNotificationExtensionInitialContentSizeRatio - نسبة ارتفاع الإشعار إلى عرضه. يؤثر على حجم الإخطار بعد عرضه بالكامل.
  • UNNotificationExtensionUserInteractionEnabled - تمكين أو تعطيل التفاعل مع عناصر التحكم المخصصة. في حالتنا ، سيكون زرًا بقلب.
  • UNNotificationExtensionDefaultContentHidden - يخفي محتويات الإخطار ، التي يتم إنشاؤها بشكل افتراضي.

في لوحة العمل ، قم بإنشاء UIImageView و UILabel لعرض عنوان الإشعار و UIButton للتفاعل مع التطبيق.



في وحدة تحكم العرض ، نقوم بإنشاء طرق لفتح التطبيق وإخفاء الإشعار:


 func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() } 

نقوم بتطبيق طرق بروتوكول UNNotificationContentExtension .


الأول سيسمح لك بعرض النص اللازم:


 func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body } 

والثاني مطلوب للتعامل مع الإجراءات من UNNotificationAction . في نفس الطريقة ، يتم استبدال الإجراءات باستخدام extensionContext؟ .NotificationActions assignment :


 func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { switch response.actionIdentifier { case "like-action": let actions = [ UNNotificationAction(identifier: "1-star", title: "★", options: []), UNNotificationAction(identifier: "2-star", title: "★ ★", options: []), UNNotificationAction(identifier: "3-star", title: "★ ★ ★", options: []), ] extensionContext?.notificationActions = actions case "open-app": openApp() default: dismissNotification() } } 

تتم معالجة الصنابير القلبية كالمعتاد من خلال IBAction :


 @IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() } 


نطلق التطبيق ونرى ما نحصل عليه:


  • تتم معالجة الضغوط من UIButton .
  • يتيح لك استخدام UNNotificationAction استبدال الخيارات المتاحة للتفاعل.

التفاعل مع إعدادات الإخطار


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


أولاً ، عند اعتماد الإخطارات ، نضيف معلمة أخرى - يوفرAppNotificationSettings :


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings]) 

ثانيًا ، نقوم بتطبيق طريقة userNotificationCenter (_: openSettingsFor :) الخاصة ببروتوكول UNUserNotificationCenterDelegate :


 extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { openSettings() } func openSettings() { let storyboard = UIStoryboard(name: "Settings", bundle: nil) let settings = storyboard.instantiateViewController(withIdentifier: "Settings") window?.rootViewController = settings } } 


الإخطارات المؤقتة


لا يفهم المستخدم دائمًا ما إذا كان يريد تلقي إشعارات من تطبيقك. لذلك ، عند بدء التطبيق لأول مرة ، يصعب عليه اتخاذ مثل هذا الاختيار. مع احتمال كبير سيرفض عرضك. في مثل هذه الحالات ، تقترح Apple استخدام التفويض المؤقت. عند طلب إذن لإرسال إخطارات ، تتم إضافة معلمة أخرى - مؤقتة . التخويل حالة هذه الإشعارات تأتي أيضًا في التطبيق بالحالة المؤقتة .


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional]) 

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


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



تنبيهات حرجة


يضيف التغيير الأخير نوعًا آخر من الإشعارات - التنبيهات الحرجة . تتجاهل هذه الإعلامات إعدادات الهاتف أو الصوت الخافت أو عدم الإزعاج تمامًا. توصي Apple باستخدامها في التطبيقات الطبية (على سبيل المثال ، قفز مستوى السكر بشكل حاد على مستخدم الجهاز) ، وكذلك لضمان سلامة المستخدمين في المنزل أو في الأماكن العامة.


يحتوي طلب التفويض على حرف خاص:



تتم إضافة عنصر جديد في الإعدادات ، ويظهر رمز إضافي على شاشة الإعلام:



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


لاستخدام الإخطارات ، استخدم معلمةiticalAlert:


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert]) 

ونشكل محتويات الإخطار:


 let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0) 

بالنسبة إلى التنبيهات الحرجة ، يمكنك تحديد الحجم الذي سيتم تشغيل الإشعار به بغض النظر عن إعدادات المستخدم.


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


يمكنك أيضًا مشاهدة مقالة e-Legion حول الإشعارات لنظام التشغيل iOS 10 أو تسجيل تقرير من WWDC - ما الجديد في إشعارات المستخدم. سنكون قادرين على مناقشة الابتكارات في MBLT DEV 2018 في موسكو في 28 سبتمبر.


أتمنى لك نهارا سعيدا وأختام الفراء للجميع ^ _ ^


UPD: الجزء الثاني من المقال حول تجميع الإخطارات بالفعل على حبري.

Source: https://habr.com/ru/post/ar416307/


All Articles