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])                    
}

UNNotificationContentuserInfo 属性 的文档指出密钥必须是 property list types。这意味着它们必须是可直接存储在 属性 列表中的简短类型列表之一。此列表中的类标量类型包括 NSNumberNSStringNSDate.

据我所知,您用作密钥的 Swift Int 0 应该 是自动的桥接到 NSNumber,因此作为密钥是合法的。似乎并没有发生。

您将不得不直接使用其中一种 plist 类型。如果你想要一个数字作为键,0 as NSNumber 应该可以工作(希望如此?),或者 NSNumber(value: 0)。我认为,更常见的是,键是一个字符串。

我认为这值得 filing a radar about,特别是因为 Swift String 显然 正确和自动桥接(到 NSString). (ObjC 方面的异常让我们知道字典无法编码,而不是无声消失,也很好......)