在后台重新加载推送通知徽章

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 服务。

我建议更改推送通知负载。

谢谢。