在后台重新加载推送通知徽章
Reloading the push notification badge in the background
我正在 xcode 10 中使用 swift3 创建一个通知服务。
现在的问题是,当一个推送通知在后台出现时(即使应用程序关闭),徽章一开始并没有增加,而是从第二个推送通知开始增加 1。
另外我进入app后台回来的时候,徽章数量正常,但是又会出现上面的问题
我试图通过延迟或本地通知来检查问题,但我一直无法弄清楚问题是什么。
以下是与 AppDelegate 内的通知相关的通知。推送通知点击事件也正常。
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate, NaverThirdPartyLoginConnectionDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert,], completionHandler: {(granted, error) in
if (granted)
{
application.registerForRemoteNotifications()
}
else{
}
})
return true
}
...
...
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.badge, .alert, .sound])
UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("userInfo: \(response.notification.request.content.userInfo)")
var userInfo:[AnyHashable: Any]?
let pushId:Int32 = userInfo?["uid"] as! Int32
self.moveView(pushId)// My app load method
}
}
运行 处于后台状态的应用程序只是暂停应用程序的途中的短暂停留。挂起时,应用程序保留在内存中但不执行任何代码。出于这个原因,您的代码没有执行,因此徽章值不会更新。有关应用程序状态和后台执行的信息,请参见下面 link。
因此,解决此问题的更好方法是在推送通知负载中发送标记值。例如
{
"aps" : {
"alert" : {
"title" : "Game Request",
"body" : "Bob wants to play poker",
"action-loc-key" : "PLAY"
},
"badge" : 5
},
"acme1" : "bar",
"acme2" : [ "bang", "whiz" ]
}
查看此link 以创建远程通知负载
除非您需要为本地通知显示徽章,否则不要以编程方式增加徽章值。如果您想在收到推送通知时在后台执行代码,请使用 VoIP push notification,它有一些限制,例如应用程序必须是相关的 VoIP 服务。
我建议更改推送通知负载。
谢谢。
我正在 xcode 10 中使用 swift3 创建一个通知服务。 现在的问题是,当一个推送通知在后台出现时(即使应用程序关闭),徽章一开始并没有增加,而是从第二个推送通知开始增加 1。 另外我进入app后台回来的时候,徽章数量正常,但是又会出现上面的问题
我试图通过延迟或本地通知来检查问题,但我一直无法弄清楚问题是什么。
以下是与 AppDelegate 内的通知相关的通知。推送通知点击事件也正常。
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate, NaverThirdPartyLoginConnectionDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert,], completionHandler: {(granted, error) in
if (granted)
{
application.registerForRemoteNotifications()
}
else{
}
})
return true
}
...
...
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.badge, .alert, .sound])
UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("userInfo: \(response.notification.request.content.userInfo)")
var userInfo:[AnyHashable: Any]?
let pushId:Int32 = userInfo?["uid"] as! Int32
self.moveView(pushId)// My app load method
}
}
运行 处于后台状态的应用程序只是暂停应用程序的途中的短暂停留。挂起时,应用程序保留在内存中但不执行任何代码。出于这个原因,您的代码没有执行,因此徽章值不会更新。有关应用程序状态和后台执行的信息,请参见下面 link。
因此,解决此问题的更好方法是在推送通知负载中发送标记值。例如
{
"aps" : {
"alert" : {
"title" : "Game Request",
"body" : "Bob wants to play poker",
"action-loc-key" : "PLAY"
},
"badge" : 5
},
"acme1" : "bar",
"acme2" : [ "bang", "whiz" ]
}
查看此link 以创建远程通知负载
除非您需要为本地通知显示徽章,否则不要以编程方式增加徽章值。如果您想在收到推送通知时在后台执行代码,请使用 VoIP push notification,它有一些限制,例如应用程序必须是相关的 VoIP 服务。
我建议更改推送通知负载。
谢谢。