Получение уведомлений только в том случае, если приложение запущено

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

В приложении есть правильные ключи plist "UINewsstandApp = YES" и "UIBackgroundModes = newsstand-content".

В делегате приложения я регистрируюсь для всех типов уведомлений, и я получаю свой токен от APNS, со стороны сервера (я использую драгоценный камень под названием Grocer). Я установил сертификат разработчика и отправлю обычный push, и он работает.

если я отправлю push-киоск, я получаю его, если приложение работает на 'didReceiveRemoteNotification', но когда приложение не работает, я ничего не получаю в центре уведомлений, что связано главным образом с тем, что "Grocer" имеет следующую полезную нагрузку { "aps": { "content-available": 1}} и не может добавлять другие ключи (предупреждение, значок и т.д.)

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

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotif)
    {
        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filePath = [cachePath stringByAppendingPathExtension:@"pushreceived.txt"];
        [@"testing" writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil];
    }

У меня есть NKDontThrottleNewsstandContentNotifications, установленное true в моих настройках по умолчанию, а затем я синхронизирую, чтобы убедиться.

когда приложение запущено, независимо от того, сколько раз я отправляю push, я всегда получаю обратный вызов на "didReceiveRemoteNotification" с соответствующим "содержимым"

Если приложение закрыто или в фоновом режиме, ничего не происходит.

Update:

Мне удалось изменить драгоценный камень, который отправляет полезную нагрузку уведомления, вот словарь, который он отправляет

{"aps"=>
   {
     "alert"=>"Hello iPhone!!",
     "content-available"=>1,
     "badge"=>1,
     "sound"=>"default"
   }
}

и вот словарь userinfo, который я получаю в своем приложении (во время работы)

{
    aps =     {
        alert = "Hello iPhone!!";
        badge = 1;
        "content-available" = 1;
        sound = default;
    };
}

обратите внимание на кавычки вокруг контента, доступного, означает ли это, что APNS проанализировал его как пользовательский ключ?

Ответы

Ответ 1

Чтобы получать уведомления, когда ваше приложение работает в фоновом режиме, вам необходимо добавить метод applicationDidEnterBackgroud в ваш основной класс. Из документации Apple:

Приложения могут также находить локальные уведомления полезными, когда они запускаются в фоновом режиме, а также некоторые сообщения, данные или другие элементы, которые могут представлять интерес для пользователя. В этом случае они должны немедленно отправить уведомление с использованием метода UIApplication nowLocalNotificationNow: (iOS предоставляет приложение ограниченное время для работы в фоновом режиме). Листинг 2-2 иллюстрирует, как вы можете это сделать.


- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application entered background state.");
    // bgTask is instance variable
    NSAssert(self->bgTask == UIInvalidBackgroundTask, nil);

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIInvalidBackgroundTask;
        });
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        while ([application backgroundTimeRemaining] > 1.0) {

            // Replace this code with your notification handling process

            NSString *friend = [self checkForIncomingChat];
            if (friend) {
                UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                if (localNotif) {
                    localNotif.alertBody = [NSString stringWithFormat:
                        NSLocalizedString(@"%@ has a message for you.", nil), friend];
                    localNotif.alertAction = NSLocalizedString(@"Read Message", nil);
                    localNotif.soundName = @"alarmsound.caf";
                    localNotif.applicationIconBadgeNumber = 1;
                    [application presentLocalNotificationNow:localNotif];
                    [localNotif release];
                    friend = nil;
                    break;
                }
            }
        }
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIInvalidBackgroundTask;
    });

}

Также note:

Поскольку единственным типом уведомлений, поддерживаемым для неиспользуемых приложений, является значок-значок, просто передайте NSRemoteNotificationTypeBadge в качестве параметра registerForRemoteNotificationTypes:.

Ответ 2

Попробуйте сделать это как проверку работоспособности:

  • В настройках → Newsstand вы автоматически загружаете контент для своего приложения.
  • Убедитесь, что вы использовали [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability], некоторые из которых были в вашем приложении.
  • Удостоверьтесь, что у вас в фоновом режиме установлен "фоновый режим".
  • Запустите приложение на устройстве, а не в симуляторе.

Если вы сделали это правильно, вы должны получить уведомление в didReceiveRemoteNotification, даже если ваше приложение не запущено.