Оновіть значок за допомогою push-сповіщення під час роботи програми у фоновому режимі


82

У мене працює push-сповіщення, і мені вдалося оновити кількість значків значків, коли програма виводиться на перший план.

Мене це трохи бентежить ... iPhone отримує сповіщення, і з’являється спливаюче повідомлення, щоб активувати мою програму, а значок оновлюється лише після мого запуску програми.

Це не звучить правильно з точки зору користувацького досвіду. Я розумію, що підрахунок значків повинен повідомляти користувача про те, що потребує дії, за допомогою збільшеного підрахунку, але це не відбувається до пізнішого етапу, коли додаток працює.

Тож чи є спосіб сказати програмі оновити кількість значків, коли вона отримує push-сповіщення та перебуває у фоновому режимі?

Зверніть увагу, що мій додаток не використовує місцезнаходження і що я вказав UIRemoteNotificationTypeBadgeу запиті на реєстрацію сповіщення.

На ура АФ


Хочете показати значок на піктограмі програми?
Аман Аггарвал

Я відображаю підрахунок на вкладках. І стикається з тим самим питанням. Коли програма знаходиться у фоновому режимі, кількість не збільшується. Як я можу встановити?
Srusti Thakkar

Відповіді:


79

Оскільки push-сповіщення обробляється iOS, а не вашим додатком, ви не можете змінити значок програми при отриманні push-сповіщення.

Але ви можете надіслати номер значка в корисному навантаженні push-сповіщення, але для цього вам доведеться зробити сервер обчислення.

Ви повинні прочитати Посібник із програмування локальних та push-сповіщень, а особливо "Повідомлення" .

Корисне навантаження може виглядати так:

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

Тепер значок значка програми відображатиме 9.


4
Я вже це роблю ... але це значення отримується лише тоді, коли мій додаток виводиться на передній план, який я згодом використовую для оновлення значення значка за допомогою [UIApplication sharedApplication] .applicationIconBadgeNumber = count;
Abolfoooud

7
Ні, вам не потрібно встановлювати номер значка в корисному навантаженні push-сповіщення.
rckoenes

11
Я ще раз подивився на свою структуру корисного навантаження, і, схоже, я передавав значення параметра значка як рядок '4', а не як int 4 !!! Тепер я працюю ... дякую за допомогу
Abolfoooud

Я перевірив, що це не працює при зміні значка структури корисного навантаження
wod

1
@wod, що ви маєте на увазі: зміна значка структури корисного навантаження.
rckoenes

11

Ми можемо змінити номер значка, коли ми перебуваємо у фоновому режимі, надіславши параметр "значок" у пакет сповіщень про натискання. Як зазначив @rckoenes, JSONпараметром значка повинен бути ІНТЕГР .

Зразок PHP-коду для того ж самого

// Create the payload body
$body['aps'] = array(
        'alert' => $message,
        'badge' => 1,
        'sound' => 'default'
        );

badge => 1 де 1 - ціле число, а не рядок (тобто без апострофів)


11

Насправді в iOS 10 віддалене сповіщення автоматично викликатиме didReceiveRemoteNotificationметод у вашому AppDelegate.

У вас є два способи оновити кількість значків у фоновому режимі.
Я зробив це для мого поточного додатка. Вам також не потрібно розширення служби сповіщень.

1-й шлях:

Надішліть ключ значка APS із своїм корисним навантаженням на APN.
Це оновить кількість значків відповідно до вашого цілого значення у вашому корисному навантаженні значка. напр .:

// 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 та оновити значки .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
}

Як оновити значок, якщо програма не працює у фоновому режимі?
Nagendra Rao

1
Якщо ви надішлете APS із ключем, доступним за вмістом, він запустить метод didReceiveRemoteNotification незалежно від стану програми. Просто спробуйте це на рідному пристрої. Якщо у вас iOS, ви можете використовувати цей інструмент для надсилання об’єкта JSON до APN: github.com/noodlewerk/NWPusher
Gkiokan,

вау, чудово, а що, якщо я надсилаю повідомлення без вмісту? (що стосується будь-якого не фонового сповіщення). didReceiveRemoteNotificationне називається
StackExploded

6
    **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.

якщо ви хочете самостійно зменшити кількість значків, зменшіть кількість та оновіть самостійно


4

Якщо ви використовуєте NotificationServiceExtension, ви можете оновити значок у цьому.

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

Щоразу, коли ваша програма отримує сповіщення, буде викликано ваше розширення служби. Збережіть це значення за замовчуванням користувача та покажіть його. Щоб розподілити за замовчуванням користувача між програмою та розширенням, потрібно ввімкнути групу програм у програмі. Детальніше читайте тут


Ви можете зберегти цю кількість сповіщень на сервері та надіслати її з повідомленням.
Surjeet Rajput,

Я використовую Firebase Cloud Messaging, чи знаєте ви, як це можна зробити?
Гіггз Піккоро,

3

З iOS 10 ви можете розробити розширення служби сповіщень для свого додатка. Він почнеться системою, коли ви отримаєте сповіщення, і ви зможете розрахувати дійсний номер значка та встановити його.

Погляньте на документацію: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextention


1

Для Firebase Cloud Messaging (FCM) це має бути так:

{
  "to": "some_token",

  "notification": {
    "body": "this is a body",
    "title": "this is a title",
    "badge" : 1
  }, 

  "priority": "high", 
}

0
-(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]);
}

Чому ви використовуєте intValue замість integerValue, яке є NSInteger? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone

0

Як сказав @rckoenes, вам доведеться виконати процедуру обчислення на стороні сервера, але як ви могли знати, коли збільшувати значення номера значка, яке слід надіслати в корисному навантаженні ?.

Під час запуску програми надішле повідомлення на ваш сервер із зазначенням запуску програми. Отже, на стороні сервера ви починаєте знову із значка = 0, і хоча повідомлень, отриманих сервером, немає, збільшуйте номер значка з кожним корисним навантаженням сповіщення.


0

в корисному навантаженні 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

}

мета content-available = 1 - мовчазне сповіщення не про значок.
Manish

0

у спадщині своєї роботи "знак" встановив рахунок

{
  "to": "token",
  "notification": {
    "title": "Example",
    "body": "Tiene 22 actualizaciones.",
    "badge":278
  },
  "data": {
    "story_id": "story_12345",
    "count_vaca":22
  }
}

-1

Після отримання віддаленого повідомлення під час відкриття програми,

отримати поточний номер значка в " didBecomeActive" Методі вашого AppDelegate.

Файл, використовуючи код нижче:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;

3
Це не спрацює, поки користувач не натисне на додаток або повідомлення про запуск програми. Він не буде робити те, що хоче ОП, оновлювати значок, коли програма перебуває у фоновому режимі і до того, як користувач взаємодіє з програмою або сповіщенням.
Alex Zavatone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.