Значки Objective-c на значке приложения отображаются при получении уведомления в фоновом режиме? - PullRequest
0 голосов
/ 17 сентября 2018

Я использую приведенный ниже код, чтобы установить значок на значке моего приложения при получении уведомления, когда приложение работает в фоновом режиме. Тем не менее, мой код / ​​журнал никогда не запускается, когда уведомление получено, когда приложение свернуто (см. Журнал: «NSLog APP WAS IN BACKGROUND»), и я не уверен, почему?

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];

    NSLog(@"application Active - notication has arrived while app was opened");

    completionHandler(UIBackgroundFetchResultNewData);

    NSLog(@"Notification received when open");

    if(application.applicationState == UIApplicationStateInactive) {


        NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background");

        completionHandler(UIBackgroundFetchResultNewData);

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];


       UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

       UITabBarController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"tabBarController"]; // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
      [viewController setSelectedIndex:0];

        ;

        self.window.rootViewController = viewController;
       [self.window makeKeyAndVisible];

            [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotificationReceived" object:nil];


    }

    if (application.applicationState == UIApplicationStateBackground) {

        NSLog(@"APP WAS IN BACKGROUND");

        static int i=1;
        [UIApplication sharedApplication].applicationIconBadgeNumber = i++;


    }

}

- (void)applicationDidEnterBackground:(UIApplication *)application{

    static int i=0;
    [UIApplication sharedApplication].applicationIconBadgeNumber = i;
    NSLog(@"Triggered!");
     }

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019
[UIApplication sharedApplication].applicationIconBadgeNumber = 3;
0 голосов
/ 17 сентября 2018

Это правильное поведение для удаленного уведомления.

Ваше приложение не получит вызов didReceiveRemoteNotification, когда ваше приложение находится в фоновом режиме, , если пользователь не нажмет на уведомление уведомления .

Вот как это работает.

1) Когда ваше приложение находится в фоновом режиме (или приостановлено) и получено удаленное уведомление, отображается системное предупреждение iOS.

2) Если пользователь открывает ваше приложение, нажав на уведомление об уведомлении, то ваше приложение переместится на передний план и будет вызван didReceiveRemoteNotification.

3) Если пользователь игнорирует уведомление или отклоняет его, то ваше приложение остается в фоновом режиме, и didReceiveRemoteNotification не будет называться .

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

Вы просто включаете ключ badge в полезную нагрузку вашего уведомления:

{
    "aps" : {
        "alert" : {
            "title" : "Notification title",
            "body" : "Notification body"
        },
        "badge" : 5
    }
}

Я бы посоветовал вам взглянуть на документацию Apple по созданию полезных данных удаленного уведомления, в которой объясняются все параметры:

https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification?language=objc

При всем этом можно сделать так, чтобы iOS вызывала didReceiveRemoteNotification, когда ваше приложение находится в фоновом режиме.

Для этого вам необходимо установить параметр content-available в вашей полезной нагрузке и отправить «тихое» уведомление. Беззвучное уведомление означает, что пользователь никогда не увидит предупреждение, но ваше приложение будет беззвучно выводиться на передний план на конечное время, и будет вызываться didReceiveRemoteNotification.

Хотя это не подходящий вариант для вашего сценария. Он предназначен для обновления содержимого приложения, а не только для обновления значка.

Однако, если вас интересуют тихие уведомления, вы можете посмотреть документацию здесь:

https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_updates_to_your_app_silently?language=objc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...