Подтвердить что ты не робот

Обновить значок с уведомлением push во время приложения в фоновом режиме

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

Я немного смущен этим, хотя... iPhone получает уведомление, и появляется всплывающее сообщение для активации моего приложения, и значок только обновляется после запуска приложения.

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

Итак, есть ли способ сообщить приложению обновить счетчик значков, когда он получает push-уведомления и пока находится в фоновом режиме?

Обратите внимание, что мое приложение не использует местоположение и у меня есть UIRemoteNotificationTypeBadge в запросе регистрации уведомлений.

Приветствия AF

4b9b3361

Ответ 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;