Как обновить значок при добавлении локального уведомления приложения и его в фоновом режиме? [Дубликат]

Почему эта проблема происходит из-за того, что Android framework не может гарантировать, что ваш сервис начнется в течение 5 секунд, но, с другой стороны, у рамки есть строгий предел для уведомления переднего плана, который должен быть запущен в течение 5 секунд без проверки того, запустите службу.

Это определенно проблема с каркасом, но не все разработчики, сталкивающиеся с этой проблемой, делают все возможное:

  1. startForeground уведомление должно быть как в onCreate, так и onStartCommand , потому что, если ваша служба уже создана, и как-то ваша активность пытается ее запустить снова, onCreate не будет вызываться.
  2. идентификатор уведомления не должен быть 0, в противном случае произойдет один и тот же сбой, даже если это не та же причина.
  3. stopSelf не нужно вызывать перед startForeground.

При всех выше 3 эта проблема может быть уменьшена, но все же не исправлена, реальное исправление или, скажем, обходное решение это понизить вашу целевую версию sdk до 25.

И обратите внимание, что, скорее всего, Android P будет это не будет связано с тем, что Google отказывается даже понять, что происходит, и не считает, что это их вина, читайте здесь 36: https://issuetracker.google.com/issues/76112072 .

55
задан James Webster 7 August 2015 в 11:49
поделиться

8 ответов

Поскольку push-уведомление обрабатывается iOS, а не ваше приложение, вы не можете изменить значок приложения при получении push-уведомления.

Но вы можете отправить номер значка в полезную нагрузку push-уведомления, но вам придется выполнять команду сервера вычислений.

Вы должны прочитать Руководство по программированию локального и Push Notification и особенно Полезная нагрузка уведомлений .

Полезная нагрузка может выглядеть так:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

Теперь значок значка приложения приложения отобразит 9.

54
ответ дан limon 19 August 2018 в 11:46
поделиться
  • 1
    Я уже делаю это ... но это значение извлекается только тогда, когда мое приложение выведено на передний план, которое позже я использую для обновления значения значка с помощью [UIApplication sharedApplication] .applicationIconBadgeNumber = count; – Abolfoooud 10 January 2013 в 13:27
  • 2
    Нет необходимости устанавливать номер значка в полезной нагрузке push-уведомления. – rckoenes 10 January 2013 в 13:28
  • 3
    У меня был другой взгляд на мою структуру полезной нагрузки, и, похоже, я передавал значение параметра badge как строку «4», а не int 4 !!! Теперь я получил его работу ... спасибо за помощь – Abolfoooud 10 January 2013 в 13:47
  • 4
    Я тестировал, что он не работает, когда меняется на значок структуры полезной нагрузки – wod 13 February 2013 в 13:40
  • 5
    @wod, что вы имеете в виду: изменение на значке структуры полезной нагрузки. – rckoenes 15 May 2013 в 14:52

Если вы используете NotificationServiceExtension, вы можете обновить значок в этом.

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display

Каждый раз, когда ваше приложение получает уведомление, будет вызываться расширение вашей службы. Сохраните это значение по умолчанию пользователя и отобразите его. Чтобы разделить пользовательские значения по умолчанию между приложением и расширением, вам необходимо включить группу приложений в приложении. Подробнее здесь

2
ответ дан commando24 19 August 2018 в 11:46
поделиться
  • 1
    Как обновить его без жесткого кодирования? – Ghiggz Pikkoro 4 May 2018 в 13:31
  • 2
    вы можете сохранить это количество уведомлений на сервере и отправить его с уведомлением. – commando24 4 May 2018 в 13:46
  • 3
    Я использую Firebase Cloud Messaging, вы знаете, как это сделать? – Ghiggz Pikkoro 4 May 2018 в 13:52

После получения удаленного уведомления при открытии приложения

получите текущий номер значка в «didBecomeActive». Метод вашего AppDelegate.

Файл с использованием кода ниже:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;
9
ответ дан Janmenjaya 19 August 2018 в 11:46
поделиться
  • 1
    Это не сработает, пока пользователь не наткнется на приложение или уведомление, чтобы запустить приложение. Он не будет делать то, что хочет OP, обновить значок, когда приложение находится в фоновом режиме, и before пользователь взаимодействует с приложением или уведомлением. – Alex Zavatone 3 September 2015 в 19:55

Начиная с iOS 10 вы можете разработать расширение службы уведомлений для своего приложения. Он будет запущен системой, когда вы получите уведомление, и вы можете рассчитать действительный номер для значка и установить его.

Взгляните на документацию: https://developer.apple .com / документация / usernotifications / unnotificationserviceextension

1
ответ дан Michael Krutoyarskiy 19 August 2018 в 11:46
поделиться

Как сказал @rckoenes, вам нужно будет делать серверный сервер вычислений, но как вы можете узнать, когда нужно увеличить значение номера значка, которое вы должны отправить в полезной нагрузке?

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

0
ответ дан mustafa 19 August 2018 в 11:46
поделиться
    **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
ответ дан slawekwin 19 August 2018 в 11:46
поделиться
-(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]);
}
0
ответ дан suvi 19 August 2018 в 11:46
поделиться
  • 1
    Почему вы используете intValue вместо integerValue, который является NSInteger? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0); – Alex Zavatone 3 September 2015 в 19:45
  • 2
    Это будет работать только тогда, когда приложение является передним приложением. – Alex Zavatone 3 September 2015 в 19:57
9
ответ дан Janmenjaya 31 October 2018 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: