UNNotificationContent userInfo 在处理响应时为空,但在发出请求时正确
UNNotificationContent userInfo is empty when handling response but correct when request is made
我正在构建桌面 Cocoa 应用程序。当用户单击按钮时,如果资源下载成功,应用程序会向用户发送本地通知。当用户点击通知时,我想打开 URL 下载资源的来源。我正在尝试使用整数键将 URL 存储在 UNMutableNotificationContent
中的 userInfo
字典中。
我可以看到在添加通知请求之前内容就在那里:[AnyHashable(0): "https://whosebug.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://whosebug.com/questions/ask") {
notificationDelegate.notify(userInfo: [0: url.absoluteString])
}
UNNotificationContent
的 userInfo
属性 的文档指出密钥必须是 property list types。这意味着它们必须是可直接存储在 属性 列表中的简短类型列表之一。此列表中的类标量类型包括 NSNumber
、NSString
和 NSDate
.
据我所知,您用作密钥的 Swift Int
0
应该 是自动的桥接到 NSNumber
,因此作为密钥是合法的。似乎并没有发生。
您将不得不直接使用其中一种 plist 类型。如果你想要一个数字作为键,0 as NSNumber
应该可以工作(希望如此?),或者 NSNumber(value: 0)
。我认为,更常见的是,键是一个字符串。
我认为这值得 filing a radar about,特别是因为 Swift String
显然 是 正确和自动桥接(到 NSString
). (ObjC 方面的异常让我们知道字典无法编码,而不是无声消失,也很好......)
我正在构建桌面 Cocoa 应用程序。当用户单击按钮时,如果资源下载成功,应用程序会向用户发送本地通知。当用户点击通知时,我想打开 URL 下载资源的来源。我正在尝试使用整数键将 URL 存储在 UNMutableNotificationContent
中的 userInfo
字典中。
我可以看到在添加通知请求之前内容就在那里:[AnyHashable(0): "https://whosebug.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://whosebug.com/questions/ask") {
notificationDelegate.notify(userInfo: [0: url.absoluteString])
}
UNNotificationContent
的 userInfo
属性 的文档指出密钥必须是 property list types。这意味着它们必须是可直接存储在 属性 列表中的简短类型列表之一。此列表中的类标量类型包括 NSNumber
、NSString
和 NSDate
.
据我所知,您用作密钥的 Swift Int
0
应该 是自动的桥接到 NSNumber
,因此作为密钥是合法的。似乎并没有发生。
您将不得不直接使用其中一种 plist 类型。如果你想要一个数字作为键,0 as NSNumber
应该可以工作(希望如此?),或者 NSNumber(value: 0)
。我认为,更常见的是,键是一个字符串。
我认为这值得 filing a radar about,特别是因为 Swift String
显然 是 正确和自动桥接(到 NSString
). (ObjC 方面的异常让我们知道字典无法编码,而不是无声消失,也很好......)