我在我的应用程序中显示通知,并且在根据通知数量增加徽章编号时遇到困难。我的代码指定如下:
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)
}
})
}
我能够收到多个通知,但是我无法增加标志值来反映通知的数量。
如果应用程序当前正在运行,则应用程序通知也不会显示,但是如果应用程序在后台,则通知会起作用。
答案 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)
}
}
}