2013-03-03 3 views
15

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

Приложение имеет правильные ключи plist «UINewsstandApp = YES» и «UIBackgroundModes = contentstand-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 в моих настройках по умолчанию, а затем я синхронизируюсь, чтобы убедиться.

, когда приложение не работает, независимо от того, сколько раз я отправить толчок, я всегда получаю обратный вызов на «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 проанализировал его как пользовательский ключ?

ответ

3

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

Приложение также может найти местные уведомления полезно, когда они работают в фоновом режиме и некоторых сообщениях, данные, или другой элемент приходит, что может представлять интерес для пользователя. В этом случае они должны немедленно отправить уведомление с использованием метода UIApplication nowLocalNotificationNow: (iOS предоставляет приложение ограниченное время для работы в фоновом режиме). Listing 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 :.

+0

уведомление в журнале новостей «в теории» должно быть в состоянии запустить приложение, даже если оно отключено с помощью «UIApplicationLaunchOptionsRemoteNotificationKey» .. этого не происходит atm – Zoidberg

+0

@ Zoidberg действительно ли этот ответ выглядит полезным? http://stackoverflow.com/a/4296282/187954 –

+0

, к сожалению, это не то, что я делаю в коде в моем вопросе: < – Zoidberg

2

Попробуйте это в качестве проверки вменяемости:

  • В меню Настройки -> Пресса, у вас есть автоматическая загрузка контента, как на ваше приложение.
  • Убедитесь, что вы использовали [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability] somehwere в своем приложении.
  • Убедитесь, что у вас есть фоновый режим в качестве «информационного стенда» в вашем plist.
  • Запустите приложение в устройстве, а не в симуляторе.

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