Пользовательские кнопки в уведомлениях IOS с использованием расширения содержимого уведомлений
Push-уведомления iOS можно улучшить с помощью следующих расширений:
- Расширение службы уведомлений — изменение/улучшение содержимого уведомления.
- Расширение содержимого уведомления — улучшение пользовательского интерфейса уведомления.
В уведомление можно добавлять кнопки с помощью расширения службы уведомлений, как описано здесь , но предположим, что я хочу использовать собственный пользовательский интерфейс (а не пользовательский интерфейс системы по умолчанию) для отображения этих кнопок. Расширение содержимого уведомления имеет контроллер представления, в котором мы можем указать пользовательский интерфейс уведомления. Начиная с iOS 12, можно добавлять собственные кнопки .
Я создал расширение содержимого уведомлений и добавил код для отображения трех кнопок, как показано ниже.
class NotificationViewController: UIViewController, UNNotificationContentExtension {
...
override func viewDidLoad() {
super.viewDidLoad()
}
// accept, tentative, decline are of type UIButton
func didReceive(_ pNotification: UNNotification) {
let screen_size: CGSize = self.view.frame.size
accept = UIButton(frame: CGRect(x: 0, y: 0, width: screen_size.width/3, height: 100))
accept?.setTitle("Accept", for: .normal)
accept?.backgroundColor = .blue
accept?.addTarget(self, action: #selector(onClicked), for: .touchUpInside)
self.view.addSubview(accept!)
tentative = UIButton(frame: CGRect(x: screen_size.width/3, y: 0, width: screen_size.width/3, height: 100))
tentative?.setTitle("Tentative", for: .normal)
tentative?.backgroundColor = .blue
tentative?.addTarget(self, action: #selector(onClicked), for: .touchUpInside)
self.view.addSubview(tentative!)
decline = UIButton(frame: CGRect(x: 2*(screen_size.width/3), y: 0, width: screen_size.width/3, height: 100))
decline?.setTitle("Decline", for: .normal)
decline?.backgroundColor = .blue
decline?.addTarget(self, action: #selector(onClicked), for: .touchUpInside)
self.view.addSubview(decline!)
view.backgroundColor = .cyan
}
@objc func onClicked(pClickedButton: UIButton) {
Log((String(format: "%@ button clicked!", pClickedButton.currentTitle!)))
}
}
Оно работает. Если я долго нажимаю сокращенный интерфейс по умолчанию (который нельзя настроить), уведомление разворачивается и отображает настраиваемое представление, содержащее эти кнопки (Принять, Под вопросом, Отклонить, как показано выше) в интерфейсе уведомлений.
С помощью приведенного выше кода, когда пользователь нажимает любую из этих кнопок, оператор журнала печатается, и ничего не происходит (даже экран уведомлений не исчезает, как это происходит с обычными уведомлениями) - и это нормально, потому что именно так он закодирован... на данный момент.
Но ожидаемое поведение таково: уведомление о нажатии исчезает из центра уведомлений, и приложение просыпается для обработки действия пользователя — нажатия кнопки в интерфейсе уведомлений. Я не уверен, как добиться такого поведения, и в документации по расширению содержимого уведомлений об этом мало что говорится .
Очень ценю любую помощь.
PS: Я новичок в пользовательском интерфейсе iOS. Извини.