根据通知数量增加徽章值

时间:2018-09-08 20:50:54

标签: ios swift notifications

我在我的应用程序中显示通知,并且在根据通知数量增加徽章编号时遇到困难。我的代码指定如下:

func notifcation(model: Model) -> Void {
    let calendar = Calendar.current
    guard let date = model.remiderDate else {return}
    let title = model.name
    let body = model.desc
    let comp2 = calendar.dateComponents([.year,.month,.day,.hour,.minute], from: date)
    let trigger = UNCalendarNotificationTrigger(dateMatching: comp2, repeats: true)
    let content = UNMutableNotificationContent()
    content.title = title
    content.body = body
    content.sound = UNNotificationSound.default()
    content.badge = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber

    let identifier = "\(date)"
    let request = UNNotificationRequest(identifier: identifier,
                                        content: content, trigger: trigger)


    center.add(request, withCompletionHandler: { (error) in
        if let error = error {
            // Something went wrong
            print(error as Any)
        }
    })
}

我能够收到多个通知,但是我无法增加标志值来反映通知的数量。

如果应用程序当前正在运行,则应用程序通知也不会显示,但是如果应用程序在后台,则通知会起作用。

3 个答案:

答案 0 :(得分:1)

您可以使用以下方法增加徽章:

UIApplication.shared.applicationIconBadgeNumber += 1

或:

content.badge = NSNumber(integerLiteral: UIApplication.shared.applicationIconBadgeNumber + 1)

要在应用程序处于前台状态时接收通知,您的视图控制器应遵循UNUserNotificationCenterDelegate协议并实现userNotification:willPresent方法,然后在{{ 1}}:

viewDidLoad()

有关本地通知的更多信息,请查看here

答案 1 :(得分:0)

实际上,这一行content.badge = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber误导了人们。 Serverside有它自己的应用程序徽章编号密钥。如果您希望完全控制与用户操作有关的徽章,则必须在UIApplicationDelegate上实现一些逻辑以反映所需的行为。类似于numbers vs actions轮询的缓存以及与该缓存一起使用的逻辑。当您的应用程序进入前台清理徽章时调用它。如果您的APNS服务器端向您发送了静态徽章计数-请与他们联系。据我所知,如果您的应用程序未运行且未调用回调,则无法从服务器更正错误的徽章计数

编辑:可能我在问题中混淆了推送和本地通知。将答案留给我提醒,请至少阅读两次该问题:)

答案 2 :(得分:0)

对于使用firebase的任何人,这应该会有所帮助。我看过的大多数示例都已弃用了有效负载结构。看起来您必须跟踪数据库中的徽章值。就我而言,增加该值的最佳位置是在发送通知时。当应用程序在您的应用程序代理中变为活动状态时,只需将其设置为0

//从Firestore触发器调用

 var sendPayload = function(id, title, body){
    
            return admin.firestore().doc('users/' + id).get().then(userDoc =>{
                             
                if (!userDoc.exists){
                    return null
                }
                var newBadge = incrementString(userDoc.get('badge'))
                const token = userDoc.get('token')
    
                if (token === null || typeof token === 'undefined'){
                    return null
                }
    
                admin.firestore().doc('users/' + id).set({
                     badge : newBadge
                         }, {merge: true});
    
    
                console.log(token)
                const payload = {
                    notification : {
                        title : title,
                        body : body,
                        sound: 'default',
                        badge: newBadge
                    },    
                }
                   return admin.messaging().sendToDevice(token,payload);
              })
        }

// App委托客户端

    func application(_ application: UIApplication,
    didReceiveRemoteNotification userInfo: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void){
        

        func setBadge(){
            if let newBadge = Int(info.badge){
                UIApplication.shared.applicationIconBadgeNumber = newBadge
            }
        }

        switch  application.applicationState {
          case .inactive:
                setBadge()
          case .background:
              // update badge count here
               setBadge()
          case .active:
            break
        @unknown default:
            fatalError("unknown state _app delegate")
        }
}

 func applicationDidBecomeActive(_ application: UIApplication) {

        if  UIApplication.shared.applicationIconBadgeNumber != 0{
            UIApplication.shared.applicationIconBadgeNumber = 0
            if let userID = Auth.auth().currentUser?.uid{
                let dict = ["badge" : "0"]
                AccountOperations.updateDocument(rootCollection: "users", doc: userID, newValueDict: dict)
            }
           
            
        }
}