Xcode Swift 3.0通知框架应用程序徽章未更新

时间:2017-02-24 12:38:41

标签: ios swift xcode push-notification badge

let content = UNMutableNotificationContent()
content.badge = 0 // your badge count

此代码位于applicationWillEnterForeground,其目的是通过将用户重新输入应用程序的数字设置为0来擦除徽章,但事实证明它完全没用,因为它不会更新应用程序上的徽章图标......

我现在已经恢复到iOS 9代码,它的工作就像一个魅力。此外,似乎使用新框架,您必须实际发送要更新的徽章编号的通知,这实际上是不切实际的。如果我错了,请有人纠正我

此外:

 let content = UNMutableNotificationContent()
        TableViewController.numberBadges += 1
        content.title = "Title"
        content.body = "this is the body ..."
        content.badge = TableViewController.numberBadges as NSNumber?
        content.sound = UNNotificationSound.default()

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let requestidentifier = "myNotification"
        let request = UNNotificationRequest(identifier: requestidentifier, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request, withCompletionHandler: {error in
            // handle error if there is one
            if((error) != nil){
                print("Error completing notification scheduling: \(error)")
            }else{
                print("Added Notification request successfully with \(content.badge!) badges")
            }

        })

不会更新徽章以便给出什么?

3 个答案:

答案 0 :(得分:1)

在将content.badge强制转换为非可选项之前,我遇到了同样的问题。

答案 1 :(得分:1)

在iOS 10和11上,通过安排UNNotificationRequest通知来删除徽章存在问题。文档说,将badge对象的UNMutableNotificationContent属性设置为0会在触发通知时删除徽章,但这似乎不起作用。通过实验,我在iOS版本中找到了此漏洞的变通方法。

在iOS 10 / Xcode 8上,正如您所观察到的,将值设置为0并不起作用 - 徽章会继续显示其当前值。我发现如果你把它设置为-1:

let content = UNMutableNotificationContent()
content.badge = -1

然后在触发通知时会删除徽章。

在iOS 11 / Xcode 9上将badge属性设置为小于1的任何值都不起作用 - 徽章继续显示其当前值。我发现如果您将徽章设置为0并设置声音属性,例如:

let content = UNMutableNotificationContent()
content.badge = 0
content.sound = UNNotificationSound.default()

然后徽章被删除。在我的应用中,我已使用requestAuthorization方法请求了显示徽章的权限,但我没有请求播放声音的权限,因此触发通知时实际上没有声音播放。 (如果您的应用确实要求播放声音的权限,并且您在删除徽章时不想玩一个,我也不知道解决方法是什么。)

更新:我还通过模拟器检查了iOS 11的解决方法是否也适用于iOS 10。

只要badge属性设置为正数,我还没有任何其他问题(尚未!)安排更新徽章的通知。

答案 2 :(得分:0)

设置徽章= 0似乎打破了。

但至于你的第二个问题......问题似乎与你的content.body和.title有关。这将导致通知显示在trey中。如果您在再次运行之前清除此标记,则徽章应每次更新。

但是如果您将旧通知留在trey中,它似乎会将新通知折叠为旧通知,而不是第二次更新徽章。好像是另一个错误。

显然,处理此问题的唯一有效方法是单独发送徽章更新文本通知(即删除.body和.title) - 当徽章!= 0时似乎工作正常。