大佬教程收集整理的这篇文章主要介绍了ios – 用户通知框架徽章不会增加,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
设置接收通知的值
center.getDeliveredNotifications { notification in UserDefaults.standard.set(notification.count,forKey: Constants.NOTIFICATION_COUNT) print("notification.count \(notification.count)") print(".count noti \(UserDefaults.standard.Integer(forKey: Constants.NOTIFICATION_COUNT))") }
这准确地打印了收到的通知数量,当我决定将其设置为我的徽章时,它只显示1
content.badge = NSnumber(value: UserDefaults.standard.Integer(forKey: Constants.NOTIFICATION_COUNT))
我不知道为什么价值不会每次都增加.任何帮助,将不胜感激.
或者,如果可以在应用程序的任何位置始终更新徽章.
func sendNotification(title: String,subtitle: String,body: String,timeInterval: TimeInterval) { let center = UNUserNotificationCenter.current() center.getPendingNotificationrequests(completionHandler: { pendingNotificationrequests in //Use the main thread since we want to access UIApplication.shared.applicationIconBadgenumber DispatchQueue.main.sync { //Create the new content let content = UNMutableNotificationContent() content.title = title content.subtitle = subtitle content.body = body //Let's store the firing date of this notification in content.userInfo let firingDate = Date().timeIntervalSince1970 + timeInterval content.userInfo = ["timeInterval": firingDate] //get the count of pending notification that will be fired earlier than this one let earlierNotificationsCount: Int = pendingNotificationrequests.filter { request in let userInfo = request.content.userInfo if let time = userInfo["timeInterval"] as? Double { if time < firingDate { return true } else { //Here we update the notofication that have been created earlier,BUT have a later firing date let newContent: UNMutableNotificationContent = request.content.mutablecopy() as! UNMutableNotificationContent newContent.badge = (Int(truncaTing: request.content.badge ?? 0) + 1) as NSnumber let newrequest: UNNotificationrequest = UNNotificationrequest(identifier: request.identifier,content: newContent,trigger: request.trigger) center.add(newrequest,withCompletionHandler: { (error) in // Handle error }) return false } } return false }.count //Set the badge content.badge = NSnumber(IntegerLiteral: UIApplication.shared.applicationIconBadgenumber + earlierNotificationsCount + 1) let trigger = UNTimeIntervalNotificationtrigger(timeInterval: timeInterval,repeats: falsE) let requestIdentifier = UUID().uuidString //You probably want to save these request identifiers if you want to remove the corresponding notifications later let request = UNNotificationrequest(identifier: requestIdentifier,content: content,trigger: trigger) center.add(request,withCompletionHandler: { (error) in // Handle error }) } }) }
(您可能需要保存请求的标识符(如果您想更新它们,可以在用户默认值或核心数据中保存,甚至可以通过removePendingNotificationRequests(withIdentifiers:)
取消它们)
sendNotification(title: "MeeTing Reminder",subtitle: "Staff MeeTing in 20 minutes",body: "Don't forget to bring coffee.",timeInterval: 10)
将您的视图控制器声明为UNUserNotificationCenterDelegate:
class ViewController: UIViewController,UNUserNotificationCenterDelegate { override func viewDidLoad() { super.viewDidLoad() UNUserNotificationCenter.current().delegate = self } //... }
要处理与通知的互动,请更新应用的徽章以及即将发布的通知的徽章:
func userNotificationCenter(_ center: UNUserNotificationCenter,didReceive response: UNNotificationResponse,withCompletionHandler completionHandler: @escaping () -> Void) { //UI updates are done in the main thread DispatchQueue.main.async { UIApplication.shared.applicationIconBadgenumber -= 1 } let center = UNUserNotificationCenter.current() center.getPendingNotificationrequests(completionHandler: {requests in //update only the notifications that have userInfo["timeInterval"] set let newrequests: [UNNotificationrequest] = requests .filter{ rq in return rq.content.userInfo["timeInterval"] is Double? } .map { request in let newContent: UNMutableNotificationContent = request.content.mutablecopy() as! UNMutableNotificationContent newContent.badge = (Int(truncaTing: request.content.badge ?? 0) - 1) as NSnumber let newrequest: UNNotificationrequest = UNNotificationrequest(identifier: request.identifier,trigger: request.trigger) return newrequest } newrequests.forEach { center.add($0,withCompletionHandler: { (error) in // Handle error }) } }) completionHandler() }
这会在通知与点击进行交互时通过减少应用徽章来更新应用徽章.此外,它还会更新待处理通知的内容徽章.添加具有相同标识符的通知请求只会更新待处理通知.
要在前台接收通知,并在未与通知交互时增加应用徽章图标,请执行以下操作:
func userNotificationCenter(_ center: UNUserNotificationCenter,willPresent notification: UNNotification,withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { DispatchQueue.main.async { UIApplication.shared.applicationIconBadgenumber += 1 } completionHandler([.alert,.sound]) }
这是一些GIF:
> 1st:接收本地通知会增加应用徽章.而与通知进行交互会减少应用徽章.
> 2nd:应用程序被杀时接收本地通知(我在此使用了15秒的触发timeInterval).
> 3rd:在前台接收通知会增加应用程序徽章,除非用户与之交互.
import UIKit import UserNotifications class ViewController: UIViewController,UNUserNotificationCenterDelegate { var bit = true @IBACtion func send(_ sender: UIButton) { let time: TimeInterval = bit ? 8 : 4 bit.toggle() sendNotification(title: "MeeTing Reminder",timeInterval: timE) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. UNUserNotificationCenter.current().delegate = self } func sendNotification(title: String,timeInterval: TimeInterval) { let center = UNUserNotificationCenter.current() center.getPendingNotificationrequests(completionHandler: { pendingNotificationrequests in DispatchQueue.main.sync { let content = UNMutableNotificationContent() content.title = title content.subtitle = subtitle content.body = body let firingDate = Date().timeIntervalSince1970 + timeInterval content.userInfo = ["timeInterval": firingDate] let earlierNotificationsCount: Int = pendingNotificationrequests.filter { request in let userInfo = request.content.userInfo if let time = userInfo["timeInterval"] as? Double { if time < firingDate { return true } else { let newContent: UNMutableNotificationContent = request.content.mutablecopy() as! UNMutableNotificationContent newContent.badge = (Int(truncaTing: request.content.badge ?? 0) + 1) as NSnumber let newrequest: UNNotificationrequest = UNNotificationrequest(identifier: request.identifier,trigger: request.trigger) center.add(newrequest,withCompletionHandler: { (error) in // Handle error }) return false } } return false }.count content.badge = NSnumber(IntegerLiteral: UIApplication.shared.applicationIconBadgenumber + earlierNotificationsCount + 1) let trigger = UNTimeIntervalNotificationtrigger(timeInterval: timeInterval,repeats: falsE) let requestIdentifier = UUID().uuidString //You probably want to save these request identifiers if you want to remove the corresponding notifications later let request = UNNotificationrequest(identifier: requestIdentifier,trigger: trigger) center.add(request,withCompletionHandler: { (error) in // Handle error }) } }) } func userNotificationCenter(_ center: UNUserNotificationCenter,withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { DispatchQueue.main.async { UIApplication.shared.applicationIconBadgenumber += 1 } completionHandler([.alert,.sound]) } func userNotificationCenter(_ center: UNUserNotificationCenter,withCompletionHandler completionHandler: @escaping () -> Void) { DispatchQueue.main.async { UIApplication.shared.applicationIconBadgenumber -= 1 } let center = UNUserNotificationCenter.current() center.getPendingNotificationrequests(completionHandler: {requests in let newrequests: [UNNotificationrequest] = requests .filter{ rq in return rq.content.userInfo["timeInterval"] is Double? } .map { request in let newContent: UNMutableNotificationContent = request.content.mutablecopy() as! UNMutableNotificationContent newContent.badge = (Int(truncaTing: request.content.badge ?? 0) - 1) as NSnumber let newrequest: UNNotificationrequest = UNNotificationrequest(identifier: request.identifier,trigger: request.trigger) return newrequest } newrequests.forEach { center.add($0,withCompletionHandler: { (error) in // Handle error }) } }) completionHandler() } }
以上是大佬教程为你收集整理的ios – 用户通知框架徽章不会增加全部内容,希望文章能够帮你解决ios – 用户通知框架徽章不会增加所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。