2013-10-15 2 views
8

Я использую parse.com в качестве поставщика APN для тестового приложения, которое я создаю. Я подтвердил, что push-уведомления работают, так как я смог успешно получать предупреждения, когда приложение находится на переднем плане. Кроме того, у меня есть значение remote-notification для ключа UIBackgroundModes, указанного в моем plist.Уведомление Apple Push в фоновом режиме

В моем приложении я хочу отправить данные текущего местоположения пользователя обратно в мою базу данных parse.com для приложения, когда получено push-уведомление. Я действительно не забочусь о самой полезной информации уведомления, так как уведомление - это просто средство для получения небольшой информации. Приложение постоянно собирает данные в фоновом режиме и сохраняет их в постоянном NSDictionary.

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

  • Я что-то не так?
  • ли вообще возможно выполнить запрос API в application:didReceiveRemoteNotification:, когда приложение работает в фоновом режиме, и пользователь не взаимодействовал с уведомлением **

EDIT: проблема сохраняется даже тогда, когда я использование application:didReceiveRemoteNotification:fetchCompletionHandler:.

Примечание: В моем NSDictionary, полном данных о местоположении, не пусто. Кроме того, я не пытаюсь манипулировать пользовательским интерфейсом в фоновом режиме - просто пытаюсь выполнить запрос API.

ответ

15

Проверьте следующее:

  • Notification полезной нагрузки включает в себя "содержание доступного"
{"alert":"", 
"badge":"0", 
"content-available":"1", 
"sound":""} 
+0

Это сработало! У меня был флаг «content-available» включен в AppDelegate, но не был нажат этот флаг в моих APN JSON. Спасибо, Алекс! Это устраняет проблему. – ArtSabintsev

+0

Ха, странно. Он работал только один раз. Посмотрите на него и вернитесь к вам – ArtSabintsev

+0

Nevermind, он работает! Это была просто задержка получения данных от разбора. – ArtSabintsev

0

documentation for UIApplicationDelegate -application:didReceiveRemoteNotification довольно ясно по этому методу:

Если приложение не работает, когда приходит толчок уведомление, метод запускает приложение и предоставляет соответствующую информацию в параметры запуска словаря. Приложение не вызывает этот метод для обработки , который выдает уведомление. Вместо этого ваша реализация приложения : willFinishLaunchingWithOptions: или application: didFinishLaunchingWithOptions: метод должен получить данные полезной нагрузки push-уведомления и ответить соответствующим образом.

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

+0

Я предполагаю, что я понял, 'не running', как полностью закрыт, а не' 'inactive' или режим background'. Я попробую это на мгновение и пометьте ваш ответ правильно, если я получу его работу. – ArtSabintsev

+0

Он все еще не работает. Теперь я пытаюсь отправить данные о местоположении из «приложения: didFinishLaunchingWithOptions:» и «application: didReceiveRemoteNotification:». Если приложение находится в фоновом режиме (например, я нажал кнопку «домой»), данные не отправляются, ЕСЛИ я не взаимодействую с уведомлением. Если я взаимодействую с уведомлением, нажав на него, будет введен метод 'application: didReceiveRemoteNotification:'. Что я делаю не так? Я принципиально неправильно понимаю, как фоновое уведомление должно работать? – ArtSabintsev

+0

Я думаю, что мое приложение фактически находится в состоянии 'приостановлено', а не в состоянии' background'. Я думаю, что это может вызвать проблему. – ArtSabintsev

0

вы можете попробовать использовать это вместо

application:didReceiveRemoteNotification 

, так как вам нужно получить ваш push в фоновом режиме, таким образом, это будет работать, когда приложение находится в фоновом режиме.Однако вам может потребоваться добавить пользовательское уведомление или UIAlertView, когда приложение находится на переднем плане для отображения вашего сообщения. Надеюсь, это поможет, и еще не слишком поздно.

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

    NSLog(@"Remote Notification Received: %@", userInfo); 

    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"message to be displayed"; 
    notification.applicationIconBadgeNumber = 1; 


    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
    completionHandler(UIBackgroundFetchResultNewData); 

} 
0

Alex L'сек ответ почти работал для меня.

Просто убедитесь, что значение из content-available является 1 (число), а не в строку "1":

{ 
    "alert":"", 
    "content-available":1, 
    "sound":"" 
} 

badge параметр является необязательным.

(Использование Синтаксического сервера для APN,)

Смежные вопросы