Пользовательские кнопки в уведомлениях IOS с использованием расширения содержимого уведомлений

Push-уведомления iOS можно улучшить с помощью следующих расширений:

  1. Расширение службы уведомлений — изменение/улучшение содержимого уведомления.
  2. Расширение содержимого уведомления — улучшение пользовательского интерфейса уведомления.

В уведомление можно добавлять кнопки с помощью расширения службы уведомлений, как описано здесь , но предположим, что я хочу использовать собственный пользовательский интерфейс (а не пользовательский интерфейс системы по умолчанию) для отображения этих кнопок. Расширение содержимого уведомления имеет контроллер представления, в котором мы можем указать пользовательский интерфейс уведомления. Начиная с 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. Извини.

0 ответов