UNNotificationContent userInfo пусто при обработке ответа, но корректно при выполнении запроса - PullRequest
0 голосов
/ 14 января 2019

Я создаю настольное приложение Cocoa. Когда пользователь нажимает кнопку, если ресурс успешно загружен, приложение отправляет локальное уведомление пользователю. Когда пользователь нажимает на уведомление, я хочу открыть URL-адрес источника загруженного ресурса. Я пытаюсь сохранить URL-адрес в словаре userInfo в UNMutableNotificationContent с целочисленным ключом.

Я вижу, что контент добавлен до того, как добавлен запрос уведомления: [AnyHashable(0): "https://stackoverflow.com/questions/ask"], но в обработчике делегата он пуст: [:]

// helper method to create the notification
func notify(userInfo: [AnyHashable : Any] = [:]) {
  let uid = UUID().uuidString
  let content = UNMutableNotificationContent()
  content.title = self.title
  content.userInfo = userInfo
  content.sound = UNNotificationSound.default
  print("add notification userInfo \(content.userInfo)")
  let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
  let request = UNNotificationRequest(identifier: uid, content: content, trigger: trigger)
  center.add(request) { (error) in
    print("add notification error \(error)")
  }
}

// notification click handler
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  print("recieved notification userInfo: \(response.notification.request.content.userInfo)")
}

Это единственное место, где создаются уведомления, и я подтвердил, что запрос identifiers соответствует.

Пример вызова notify ()

if let url = URL(string: "https://stackoverflow.com/questions/ask") {
  notificationDelegate.notify(userInfo: [0: url.absoluteString])                    
}

1 Ответ

0 голосов
/ 17 января 2019

Документация для UNNotificationContent userInfo свойств отмечает, что ключи должны быть типов списка свойств . Это означает, что они должны быть одним из коротких списков типов, которые непосредственно хранятся в списке свойств. Подобные скалярам типы в этом списке включают NSNumber, NSString и NSDate.

Литерал Swift Int 0, который вы используете в качестве ключа , должен , насколько я знаю, автоматически соединяться с NSNumber и, следовательно, быть допустимым в качестве ключа. Кажется, этого не происходит.

Вам придется напрямую использовать один из этих типов списков. Если вам нужен номер в качестве ключа, 0 as NSNumber должен работать (надеюсь?) Или NSNumber(value: 0). Я думаю, что чаще всего ключом является строка.

Я думаю, что это стоит подачи радара о , тем более что Swift String, по-видимому, соединен правильно и автоматически (до NSString). (Исключение со стороны ObjC, чтобы сообщить нам, что словарь не может быть закодирован, а не тихое исчезновение, также было бы хорошо ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...