Обновить счетчик значков в Swift

С помощью следующего кода я получаю (2) значок значка сразу после компиляции приложения:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let installation = PFInstallation.currentInstallation()
    installation.setDeviceTokenFromData(deviceToken)
    installation.badge = 2
    installation.saveInBackground()
}

Я попробовал следующий вариант: инициализировал новый var badgeCount = 0 и позже:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    badgeCount++
    let installation = PFInstallation.currentInstallation()
    installation.setDeviceTokenFromData(deviceToken)
    installation.badge = badgeCount
    installation.saveInBackground()
}

Но когда я получаю новые уведомления, они не обновляются до +1. Кто-нибудь знает, как это исправить?


person Orkhan Alizade    schedule 24.04.2015    source источник
comment
Не могли бы вы поделиться своим кодом и настройками Parse, потому что кажется, что вы решили свою проблему, и у меня есть тот же вопрос, но я не могу это исправить. Я не использую Parse в настоящее время, но если вы сможете успешно подсчитать количество значков обновления, я буду использовать его. Большое тебе спасибо.   -  person Ghiggz Pikkoro    schedule 29.06.2018


Ответы (5)


Этот метод не будет обновлять номер значка, если приложение не открыто. Если вы хотите обновить номер значка при получении уведомления, вам необходимо установить для свойства Badge push-уведомления json желаемый номер.

Если вы отправляете обычное сообщение (не используя json), есть переключатель для увеличения номера значка, просто отметьте его. Если вы используете Json, используйте это:

{
    "aps": {
        "alert": "Test Push Notification",
        "sound": "yourSound.aiff",
        "Badge": "desiredNumber"
    }
}

Обратите внимание: если вы не хотите отправлять это с сервера, вы также можете отправить его с одного устройства на другое, используя клиентское push-уведомление Parse, зайдите в свои настройки в приложении на Parse.com и включите «клиентское push-уведомление», вы можете затем отправьте указанный выше Json на устройство другого пользователя.

person Swinny89    schedule 24.04.2015
comment
как я могу отправить его с сервера? Как узнать, сколько уведомлений не прочитано? - person Orkhan Alizade; 24.04.2015
comment
Похоже, вы используете parse.com, верно? Если вы, если вы отправляете обычное сообщение (не используя сына), есть переключатель для увеличения номера значка, просто отметьте его. Если вы используете Json, используйте это: {aps: { alert: Test Push Notification, sound: yourSound.aiff, Badge: numberYouNeed} - person Swinny89; 24.04.2015
comment
Нет, я использую Pase.com. Можете ли вы сказать мне, как это сделать? Увеличить значение значка - person Orkhan Alizade; 24.04.2015
comment
Я только что сделал, проверьте мой последний комментарий, я также обновил свой ответ - person Swinny89; 24.04.2015
comment
нет, я не хочу отправлять его с сервера. В документации Parse.com gameScore.incrementKey. Могу ли я использовать его? - person Orkhan Alizade; 24.04.2015
comment
Это ответ - просто найдите минутку, чтобы прочитать, что на самом деле опубликовал Swinny89. Swinny89 - вы можете отредактировать свой ответ своим комментарием - person Damo; 24.04.2015
comment
@Damo Я не хочу отправлять это количество значков с сервера в формате JSON. Я хочу увеличивать его после каждого уведомления, если оно не прочитано. Если читал - сбрасываю на 0 - person Orkhan Alizade; 24.04.2015
comment
Прочтите еще раз первую строчку моего ответа - person Swinny89; 24.04.2015
comment
ваша версия просто изменила его на 1 и не увеличивала его позже. Как я могу увеличить его? Я отправил это как JSON - person Orkhan Alizade; 24.04.2015
comment
Давайте начнем с самого начала. Как вы на самом деле отправляете свое push-сообщение? С parse.com в разделе push? - person Swinny89; 24.04.2015
comment
Убедитесь, что тип сообщения установлен как обычный текст, значок увеличения — да, введите свое сообщение и отправьте его. Если приложение не открыто, значок будет обновлен для вас. При открытии приложения или всякий раз, когда вам нужно, убедитесь, что вы установили значок обратно на 0, используя UIApplication.sharedApplication().applicationIconBadgeNumber = 0, а также используя currentInstalltion.badge = 0, а затем сохраните его в фоновом режиме. - person Swinny89; 24.04.2015

Всякий раз, когда код компилируется, он показывает значок значка, который ранее хранился в вашем приложении. Если вы не установите значок значка = 0 в своем приложении, он будет отображать номер значка значка в вашем приложении каждый раз, когда вы его компилируете или входите в фоновое состояние.

Теперь для вашей проблемы используйте значок значка как

var badgeCount = 0 

 UIApplication.sharedApplication().applicationIconBadgeNumber = ++badgeCount

Также всякий раз, когда вы закончите свою задачу, сделайте значок значка равным 0, иначе он отобразит значок значка в вашем приложении.

UIApplication.sharedApplication().applicationIconBadgeNumber = 0
person Rizwan Shaikh    schedule 24.04.2015
comment
Я вставляю его внутрь didRegisterForRemoteNotificationsWithDeviceToken типа: let notif = UIApplication.sharedApplication() notif.applicationIconBadgeNumber = ++badgesCount installation.saveInBackground() и снова ничего =/ - person Orkhan Alizade; 24.04.2015
comment
если вы не сделаете значок значка = 0, он будет отображаться все время - person Rizwan Shaikh; 24.04.2015
comment
пожалуйста, опишите поток вашего приложения, чтобы мы могли изменить номер значка. например, изначально он равен 0, когда push-уведомление увеличивается, а после некоторого уменьшения задачи - person Rizwan Shaikh; 24.04.2015

Я работал над аналогичным сценарием и нашел окончательное решение для увеличения и сброса номеров значков.

Увеличить номер значка

  1. Я всегда сохраняю количество значков в памяти (NSUserDefaults)
  2. Каждый раз, когда мне нужно установить уведомление, я получаю приращение текущего номера значка, устанавливаю этот номер на .applicationIconBadgeNumber и обновляю счетчик в памяти.

Сбросить номер значка

  1. В моем случае мне нужно сбросить все счетчики значков после открытия приложения. Итак, я установил UIApplication.sharedApplication().applicationIconBadgeNumber = 0 в didFinishLaunchingWithOptions из AppDelegate. Так же сбрасываю счётчик в памяти.
person Rahul Krishna    schedule 11.11.2015

В Swift 5 вы можете обновлять значок приложения в любое время, используя этот код:

UIApplication.shared.applicationIconBadgeNumber = 0 // YOUR NUMBER DESIRED
person Diego Carrera    schedule 30.10.2019

Ни один из этих ответов больше не актуален.

Вам нужно смотреть на свой Push-код, а не на AppDelegate.

Из документов Parse:

badge: (iOS/OS X only)
the value indicated in the top right corner of the app icon. 
This can be set to a value or to Increment in order to increment the current value by 1.
person Eric Johnson    schedule 26.11.2015