نقوم بتغيير محتويات تطبيق الإخطار iOS

تحية!

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

آمل أن تكون هذه المقالة مفيدة للمبتدئين في البرمجة لـ iOS على Swift. من المفترض أن لديك بعض الخبرة على الأقل في البرمجة باستخدام Swift لنظام iOS. اعتدت Swift 5 و Xcode 10.2.1. وهكذا ، دعونا نبدأ.


مهمة


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

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

أستخدم الطريقة التالية لإظهار إشعار (جميع التفسيرات أدناه):

1. أولاً وقبل كل شيء ، يجب علينا تحديد مثيل لـ UNUserNotificationCenter:

class NotificationService: NSObject, UNUserNotificationCenterDelegate { let notificationCenter = UNUserNotificationCenter.current() } 


2. بعد ذلك ، نعلن عن طريقة نستخدمها لإرسال الإشعارات:
طريقة طلب الإشعار
 // 1 //   ,      Tuple    . // showBody -     Bool,           . // withAction -     Bool,       ,   ""  . // atDate date -    Date,      ,      . func showNotification(with item: (String, String), showBody: Bool, withAction: Bool, atDate date: Date) { // 2 //    let content = UNMutableNotificationContent() // 3 //     let userActionsIdentifier = “showMe” // 4 //      . content.title = item.0 // 5 //    ,      false,  ,       . if showBody { content.body = item.1 } // 6 //     -    notificationCenter userInfo      . content.userInfo = [item.0: item.1] content.sound = UNNotificationSound.default // 7 //        withAction  true,      "Show me". if withAction { content.categoryIdentifier = userActionsIdentifier } // 8 //    ,        . let notificationID = item.0 // 9 //      . //       ,      . var dc = DateComponents() dc.hour = Calendar.current.component(.hour, from: date) dc.minute = Calendar.current.component(.minute, from: date) dc.second = Calendar.current.component(.second, from: date) // 10 //   .     ,       UNCalendarNotificationTrigger. let trigger = UNCalendarNotificationTrigger(dateMatching: dc, repeats: false) // 11 //        ,   . let request = UNNotificationRequest(identifier: notificationID, content: content, trigger: trigger) // 12 //     notificationCenter,     . notificationCenter.add(request) { (error) in error == nil ? print(“notifacation request was added at “, trigger.nextTriggerDate()!) : print(error.debugDescription) } // 13 //    .            .      . let action = UNNotificationAction(identifier: “showMe”, title: “Show me”, options: []) // 14 //   . let category = UNNotificationCategory(identifier:userActionsIdentifier, actions: [action], intentIdentifiers: [], options: []) // 15 //      notificationCenter. notificationCenter.setNotificationCategories([category]) } 



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

 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { … } 


لذلك ، الكود الذي أستخدمه في طريقة المفوض هذا هو كما يلي:

طريقة مندوب بلدي
 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print(“didReceive response”) // 1 //   switch     switch response.actionIdentifier { case “showMe”: print(“showMe action”) // 2 //      userInfo,      showNotification   6,      String. let mainText = response.notification.request.content.userInfo.keys.first! as! String // 3 //       userInfo,      showNotification   6,       String. let subText = response.notification.request.content.userInfo.values.first! as! String // 4 //       showNotificationlet,    : // showBody    true,  withAction  false (       ). self.showNotification(with: (mainText, subText), showBody: true, withAction: false, atDate: Date(timeInterval: 3, since: Date())) default: print(“defaul action”) } completionHandler() } 



وهنا هو ما يبدو:



يوجد داخل المشروع (الذي يمكنك تنزيله من الرابط أدناه) المزيد من التعليمات البرمجية ، ولكن يتم وصف جوهر الفكرة في هذه المقالة.

شكرا لك

رابط للمشروع

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


All Articles