Обновить значок с уведомлением push во время приложения в фоновом режиме
У меня есть push-уведомление, и мне удалось обновить значок значка, когда приложение выведено на передний план.
Я немного смущен этим, хотя... iPhone получает уведомление, и появляется всплывающее сообщение для активации моего приложения, и значок только обновляется после запуска приложения.
Это не кажется правильным с точки зрения пользователя. Мое понимание заключается в том, что счетчик значков должен уведомлять пользователя о том, что требует действия, посредством увеличения количества, но это не происходит до более позднего этапа, когда приложение активно.
Итак, есть ли способ сообщить приложению обновить счетчик значков, когда он получает push-уведомления и пока находится в фоновом режиме?
Обратите внимание, что мое приложение не использует местоположение и у меня есть UIRemoteNotificationTypeBadge
в запросе регистрации уведомлений.
Приветствия
AF
Ответы
Ответ 1
Поскольку push-уведомление обрабатывается iOS, а не ваше приложение, вы не можете изменить значок приложения при получении push-уведомления.
Но вы можете отправить номер значка в полезную нагрузку push-уведомления, но вам придется выполнять команду сервера вычислений.
Вы должны прочитать Руководство по программированию локального и Push Notification и особенно Полезная нагрузка уведомлений.
Полезная нагрузка может выглядеть так:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9
}
}
Теперь значок значка приложения приложения отобразит 9.
Ответ 2
Мы можем изменить номер значка, когда мы находимся в фоновом состоянии, отправив значок "значок в пакет push-уведомлений. Как отметил @rckoenes, параметр JSON
для значка должен быть INTEGER.
Пример кода PHP для выполнения того же
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'badge' => 1,
'sound' => 'default'
);
badge => 1
где 1 - целое число, а не строка (т.е. без апострофии)
Ответ 3
**This is the APNS payload get back from server.**
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Значение для ключевого значка автоматически считается счетчиком значков. На стороне iOS-приложения нет необходимости вычислять или обрабатывать счет.
В приведенном выше примере 9 находится значок значка. Таким образом, ваш значок приложения отобразит 9.
ПРИМЕЧАНИЕ. Пока ваше приложение закрыто, вы не можете самостоятельно обращаться с значками. Вот почему мы используем значок значка из APNS Payload
Для лучшего разъяснения об уведомлении см. Документацию
если вы хотите уменьшить количество значков на свой собственный. Сделайте счетчик и обновите его самостоятельно. Следуйте
Ответ 4
Если вы используете NotificationServiceExtension, вы можете обновить значок в этом.
var bestAttemptContent : UNMutableNotificationContent? //
bestAttemptContent.badge = 0//any no you wanna display
Каждый раз, когда ваше приложение получает уведомление, будет вызываться расширение вашей службы. Сохраните это значение по умолчанию пользователя и отобразите его.
Чтобы разделить пользовательские значения по умолчанию между приложением и расширением, вам необходимо включить группу приложений в приложении.
Подробнее здесь
Ответ 5
С iOS 10 вы можете разработать расширение службы уведомлений для своего приложения. Он будет запущен системой, когда вы получите уведомление, и вы можете рассчитать действительный номер для значка и установить его.
Взгляните на документацию:
https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
Ответ 6
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
application.applicationIconBadgeNumber = 0;
NSLog(@"userInfo %@",userInfo);
for (id key in userInfo) {
NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
}
[application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}
Ответ 7
Как сказал @rckoenes, вам придется делать серверный сервер вычислений, но как вы могли узнать, когда нужно увеличить значение номера значка, которое вы должны отправить в полезную нагрузку?
При запуске приложения отправьте на сервер сообщение с сообщением о запуске приложения. Таким образом, на стороне сервера вы начинаете снова с badge = 0, и пока нет сообщений, полученных сервером, увеличивайте номер значка с каждой полезной нагрузкой push-уведомления.
Ответ 8
На самом деле в iOS 10 удаленное уведомление будет автоматически didReceiveRemoteNotification
метод didReceiveRemoteNotification
в приложении AppDelegate.
У вас есть 2 способа обновления значка в фоновом режиме.
Я сделал это и для своего текущего приложения. Вы не нуждаетесь в расширении службы уведомлений eithier.
1-й путь
Отправьте ключ значка APS с вашей полезной нагрузкой в APN.
Это обновит счетчик значков в соответствии с вашим значением Integer в вашей полезной нагрузке значка. например:
// Payload for remote Notification to APN
{
"aps": {
"content-available": 1,
"alert": "Hallo, this is a Test.",
"badge": 2, // This is your Int which will appear as badge number,
"sound": default
}
}
2-й путь
Вы можете переключить приложение application.applicationState и обновить свои значки. Когда приложение ApplicationState находится в .background
. НО вы должны позаботиться о том, чтобы не устанавливать параметр ключа значка в свою полезную нагрузку для уведомлений при отправке в APN ex
// Payload to APN as silent push notification
{
"aps": {
"content-available": 1
}
}
Обрабатывать значок Обновление в соответствии с состоянием приложения
Вот мой рабочий код для обновления счетчика значков без значка в полезной нагрузке для APN.
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("APN recieved")
// print(userInfo)
let state = application.applicationState
switch state {
case .inactive:
print("Inactive")
case .background:
print("Background")
// update badge count here
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
case .active:
print("Active")
}
}
Сбросить количество значков
Не забудьте сбросить счетчик значков, когда ваше приложение вернется в активное состояние.
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
Ответ 9
в полезной нагрузке apns необходимо определить "доступный контент": 1 для обновления значка в фоновом режиме
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// increase badge count, but no need if you include content-available
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
}
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
например.
"aps":{
"alert":"Test",
"sound":"default",
"content-available":1
}
Ответ 10
После получения удаленного уведомления при открытии приложения
получить текущий номер значка в методе didBecomeActive
<. didBecomeActive
.
Файл с использованием кода ниже:
int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
badgeCount = badgeCount + 1;