UNMutableNotificationContent с настраиваемым объектом в userinfo

Я хочу использовать объект cutom в пользовательской информации UNMutableNotificationContent, но это не работает. Когда я помещаю пользовательский объект в userinfo, уведомление не срабатывает.

С помощью этого кода запускается уведомление:

let content = UNMutableNotificationContent()
content.title = "title"
content.body = "body"
content.categoryIdentifier = "alarmNotificationCategory"
content.sound = UNNotificationSound.default()
content.userInfo = ["myKey": "myValue"] as [String : Any]


let request = UNNotificationRequest(identifier: "alarmNotification", content: content, trigger: nil)
UNUserNotificationCenter.current().add(request) { error in
    UNUserNotificationCenter.current().delegate = self
    if error != nil {
        print(error!)
    }
}

Со следующим, нет ошибки, но уведомление не запускается:

let content = UNMutableNotificationContent()
content.title = "title"
content.body = "body"
content.categoryIdentifier = "alarmNotificationCategory"
content.sound = UNNotificationSound.default()
content.userInfo = ["myKey": TestClass(progress: 2)] as [String : Any]


let request = UNNotificationRequest(identifier: "alarmNotification", content: content, trigger: nil)
UNUserNotificationCenter.current().add(request) { error in
    UNUserNotificationCenter.current().delegate = self
    if error != nil {
        print(error!)
    }
}

TestClass — это пользовательский класс, вот его определение:

class TestClass: NSObject, NSSecureCoding {
    public var progress: Float = 0

    required override public init() {
        super.init()
    }

    public init(progress: Float) {
        self.progress = progress
    }

    public required convenience init?(coder aDecoder: NSCoder) {
        self.init()
        progress = aDecoder.decodeObject(forKey: "progress") as! Float
    }

    public func encode(with aCoder: NSCoder) {
        aCoder.encode(progress, forKey: "progress")
    }

    public static var supportsSecureCoding: Bool {
        get {
            return true
        }
    }

}

Есть идеи?


person squall2022    schedule 28.12.2016    source источник
comment
У меня та же проблема, например, я хочу передать UIImage в userInfo, а уведомление вообще не срабатывает. Кажется, что вы можете передавать только примитивные типы (Int, String, float и т.д.).   -  person Alessio Dal Bianco    schedule 09.01.2017


Ответы (1)


Ваш объект должен быть списком свойств

Ключи в этом словаре должны быть типами списка свойств, т. е. они должны быть типами, которые можно сериализовать в формат списка свойств. Для получения информации о типах списка свойств см. Руководство по программированию списка свойств.

вы можете преобразовать свой объект в NSData (заархивировать его с помощью NSArchiver)

person Red Mak    schedule 11.08.2017