【发布时间】:2017-07-11 11:56:20
【问题描述】:
在一次 WWDC 会议中,我获得了用于更新现有通知的代码 sn-p。我不认为它有效。正在尝试更新通知内容。
首先,我向UNUserNotificationCenter 请求待处理通知,这始终有效。然后我正在创建新的请求以使用现有的唯一标识符更新通知。
有 1 个新变量 content: String。
// Got at least one pending notification.
let triggerCopy = request!.trigger as! UNTimeIntervalNotificationTrigger
let interval = triggerCopy.timeInterval
let newTrigger = UNTimeIntervalNotificationTrigger(timeInterval: interval, repeats: true)
// Update notificaion conent.
let notificationContent = UNMutableNotificationContent()
notificationContent.title = NSString.localizedUserNotificationString(forKey: "Existing Title", arguments: nil)
notificationContent.body = content
let updateRequest = UNNotificationRequest(identifier: request!.identifier, content: notificationContent, trigger: newTrigger)
UNUserNotificationCenter.current().add(updateRequest, withCompletionHandler: { (error) in
if error != nil {
print("???? Couldn't update notification \(error!.localizedDescription)")
}
})
我无法捕捉到错误。问题是通知内容body没有改变。
更新。
我还尝试使用不同的重复间隔更改触发器。它不起作用,通知会以与创建时相同的原始间隔重复。
更新 2。
阅读 Chris 的回答,尝试使用第一个选项。
let center = UNUserNotificationCenter.current()
center.getPendingNotificationRequests(completionHandler: { (requests) in
for request in requests {
if request.identifier == notificationIdentifier {
// Got at least one pending notification,
// update its content.
let notificationContent = UNMutableNotificationContent()
notificationContent.title = NSString.localizedUserNotificationString(forKey: "new title", arguments: nil)
notificationContent.body = "new body"
request.content = notificationContent // ⛔️ request.content is read only.
}
}
})
如您所见,我无法修改原始请求。
更新 3。
已经选择了第二个“先删除”选项。注意到调用removePendingNotificationRequests 并安排之后,仍然给我旧的通知版本。我不得不在调用removePendingNotificationRequests 和center.add(request) 之间增加1 秒的延迟。
已将 Chris 的回答标记为已接受,但请随时分享更好的选择。
【问题讨论】:
-
content的类型是什么?你能打印出来并确保它是你所期望的吗? -
内容类型为字符串。
-
FWIW 这是一个令人困惑的名字。不要试图通过给内容不同的名称来区分
notificationContent.body和content。只需将其写为notificationContent.body = body,因为加班时您可能会遇到我刚刚遇到的确切困惑。左边是另一个的属性,右边是一个局部变量——足以让其他人知道不同之处,也知道相似之处。但是您可以再次打印并查看正文/标题是否是您所期望的吗?让我知道结果。否则,到目前为止,您的代码看起来还不错。我还粘贴了我自己的 Xcode 来试一试。 -
你一定是在代码的其他地方做错了,否则你的字符串又不正确了。我刚刚用一个非常相似的代码进行了验证。我对
identifier以外的所有内容进行了更改,并更新了之前的通知。为此,您无需删除待处理的通知。只需将新的 NotificationRequest 添加到 NotificationsCenter 即可。我强烈建议您查看此answer 并下载示例项目。这是一个非常非常好的示例项目 -
使用您当前的解决方案将最后一行 从
request.content = notificationContenttolet updateRequest = UNNotificationRequest(identifier: notificationIdentifier, content: notificationContent, trigger: newTrigger)和UNUserNotificationCenter.current().add(updateRequest, withCompletionHandler: { (error) in print("successfully updated") if error != nil { print("???? Couldn't update notification \(error!.localizedDescription)") }更改。基本上抢
标签: ios swift3 usernotifications