Swift - UNUsernotification 检查 BadgeNumberIcon 中的更改
Posted
技术标签:
【中文标题】Swift - UNUsernotification 检查 BadgeNumberIcon 中的更改【英文标题】:Swift - UNUsernotification checking changes in BadgeNumberIcon 【发布时间】:2017-09-18 14:31:46 【问题描述】:我想在标签中显示徽章编号的值。
到目前为止,我已将所有内容都放在我的 viewWillAppear 中。因此,每次加载控制器时都会分配变量。代码如下:
var deliveredNotif = Int()
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(true)
deliveredNotif = UIApplication.shared.applicationIconBadgeNumber
myBadgeLabel.text = "\(deliveredNotif)"
我的问题是: 如果控制器处于活动状态并且已经调用了 viewWillAppear,我如何更新 DeliveredNotif?这意味着如果我在控制器中,是否有办法触发一个函数,该函数将在每次更改 applicationIconBadgeNumber 的值时更新 DeliverNotif 的值?
谢谢!
--------更新----我的解决方案 我创建了一个常量变量: var iconBadgeNumber = NSNumber()
在我的 Appdelegate 中有:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
completionHandler([.alert, .badge])
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "applicationIconBadgeNumber"), object: nil)
iconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber
然后在我的控制器中:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(updateIconBadgeNumber), name: NSNotification.Name(rawValue: "applicationIconBadgeNumber"), object: nil)
@objc func updateIconBadgeNumber()
if iconBadgeNumber == 0
print("zero")
else
print("there unread notification")
【问题讨论】:
【参考方案1】:您可以将您的UIViewController
设置为关键路径“applicationIconBadgeNumber”的观察者:
首先注册远程通知。在您的 didFinishLaunchingWithOptions 函数中,添加:
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) _, _ in
DispatchQueue.main.async
application.registerForRemoteNotifications()
不要忘记在文件顶部添加:import UserNotifications
然后在你的 viewDidLoad 中添加:
UIApplication.shared.addObserver(self, forKeyPath: "applicationIconBadgeNumber", options: .new, context: nil)
然后,重写 observeValue 函数:
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?)
if keyPath == "applicationIconBadgeNumber"
deliveredNotif = UIApplication.shared.applicationIconBadgeNumber
myBadgeLabel.text = "\(deliveredNotif)"
【讨论】:
我已经尝试完全按照您的建议去做...但是如果 UIViewController 已经打开,它不会触发 observeValue... 我更新了我的答案:我先添加了寄存器。我已经在一个示例项目中进行了测试,它可以工作;) 不适用于ios 13 / Swift 5。回调仅在手动设置UIApplication.shared.applicationIconBadgeNumber
时触发,而不是在收到推送通知时触发【参考方案2】:
您有 3 种不同的方式来通知对象更改的值:
首先,您拥有通知中心,以便在您的值更改时通知观察者。 看看这个post,网上有更多信息,你会找到你想要的。
此外,您还可以使用协议和委托,但对于值的通知更新来说似乎有点繁重。
最后你一定要看看这个post,它解释了键值观察(KVO)的原理,我相信你已经听说过。
最后,最终文章将向您解释何时应该使用这些原则。
KVO vs NSNotification vs protocol/delegates?
在发布已多次回答的问题之前,您应该尝试更认真地进行调查。
希望这篇文章对你有所帮助。
【讨论】:
感谢答案...我是 swift 新手...而且我已经做了一些研究...不幸的是还没有找到我的答案...我考虑过使用通知中心。 ..这就是我想要做的。我的问题是,不幸的是,我不太清楚将观察者放在哪里......以上是关于Swift - UNUsernotification 检查 BadgeNumberIcon 中的更改的主要内容,如果未能解决你的问题,请参考以下文章