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 中的更改的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift