На самом деле в iOS 10 удаленное уведомление будет автоматически вызывать didReceiveRemoteNotification
метод в вашем AppDelegate.
У вас есть 2 способа обновить счетчик значков в фоновом режиме.
Я сделал это и для своего текущего приложения. Вам также не нужно расширение службы уведомлений.
1-й способ:
Отправьте ключ значка APS с данными в APN.
Это обновит счетчик значков в соответствии с вашим значением Integer в полезной нагрузке значка. пример:
{
"aps": {
"content-available": 1,
"alert": "Hallo, this is a Test.",
"badge": 2,
"sound": default
}
}
2-й способ:
Вы можете переключить свой application.applicationState и обновить количество значков, когда applicationState находится внутри .background
. НО вы должны позаботиться о том, чтобы не устанавливать параметр ключа значка в своей полезной нагрузке уведомления при отправке в APN ex
{
"aps": {
"content-available": 1
}
}
Обработайте обновление значка в соответствии с состоянием приложения:
Вот мой рабочий код для обновления счетчика значков без ключа значка в полезной нагрузке для APN.
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("APN recieved")
let state = application.applicationState
switch state {
case .inactive:
print("Inactive")
case .background:
print("Background")
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
case .active:
print("Active")
}
}
Сбросить количество значков:
Не забудьте сбросить счетчик значков, когда ваше приложение вернется в активное состояние.
func applicationDidBecomeActive(_ application: UIApplication) {
application.applicationIconBadgeNumber = 0
}