Почему эта проблема происходит из-за того, что Android framework не может гарантировать, что ваш сервис начнется в течение 5 секунд, но, с другой стороны, у рамки есть строгий предел для уведомления переднего плана, который должен быть запущен в течение 5 секунд без проверки того, запустите службу.
Это определенно проблема с каркасом, но не все разработчики, сталкивающиеся с этой проблемой, делают все возможное:
При всех выше 3 эта проблема может быть уменьшена, но все же не исправлена, реальное исправление или, скажем, обходное решение это понизить вашу целевую версию sdk до 25.
И обратите внимание, что, скорее всего, Android P будет это не будет связано с тем, что Google отказывается даже понять, что происходит, и не считает, что это их вина, читайте здесь 36: https://issuetracker.google.com/issues/76112072 .
Поскольку push-уведомление обрабатывается iOS, а не ваше приложение, вы не можете изменить значок приложения при получении push-уведомления.
Но вы можете отправить номер значка в полезную нагрузку push-уведомления, но вам придется выполнять команду сервера вычислений.
Вы должны прочитать Руководство по программированию локального и Push Notification и особенно Полезная нагрузка уведомлений .
Полезная нагрузка может выглядеть так:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9
}
}
Теперь значок значка приложения приложения отобразит 9.
Если вы используете NotificationServiceExtension, вы можете обновить значок в этом.
var bestAttemptContent : UNMutableNotificationContent? //
bestAttemptContent.badge = 0//any no you wanna display
Каждый раз, когда ваше приложение получает уведомление, будет вызываться расширение вашей службы. Сохраните это значение по умолчанию пользователя и отобразите его. Чтобы разделить пользовательские значения по умолчанию между приложением и расширением, вам необходимо включить группу приложений в приложении. Подробнее здесь
После получения удаленного уведомления при открытии приложения
получите текущий номер значка в «didBecomeActive
». Метод вашего AppDelegate
.
Файл с использованием кода ниже:
int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
badgeCount = badgeCount + 1;
Начиная с iOS 10 вы можете разработать расширение службы уведомлений для своего приложения. Он будет запущен системой, когда вы получите уведомление, и вы можете рассчитать действительный номер для значка и установить его.
Взгляните на документацию: https://developer.apple .com / документация / usernotifications / unnotificationserviceextension
Как сказал @rckoenes, вам нужно будет делать серверный сервер вычислений, но как вы можете узнать, когда нужно увеличить значение номера значка, которое вы должны отправить в полезной нагрузке?
Будет ли при запуске отправки приложения сообщение на ваш сервер, указывающее, что приложение было запущено. Таким образом, на стороне сервера вы начинаете снова с badge = 0, и пока нет сообщений, полученных сервером, увеличивайте номер значка с каждой полезной нагрузкой push-уведомления.
**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 Для лучшего пояснения об уведомлении см. Документацию
, если вы хотите уменьшить количество значков на свой собственный. Сделайте счетчик и обновите его самостоятельно. Следуйте за
-(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]);
}
@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
– Alex Zavatone
3 September 2015 в 19:45