Фоновая работа для iOS7, но не для iOS8

У меня есть приложение, которое использует фоновой push, все работает нормально, когда приложение работает на устройстве с iOS 7, но толкатели не доставляются в приложение, если его в фоновом режиме, если он работает на устройстве с iOS 8 ,

У меня это как регистрационный код:

- (void) registerForRemoteNotification { // Check for the presense of iOS8 notification API if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)]) { NSLog(@"iOS8 detected"); [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { // iOS version < 8 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } } 

Я также пробовал этот вариант:

 - (void) registerForRemoteNotification { // Check for the presense of iOS8 notification API if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)]) { NSLog(@"iOS8 detected"); [[UIApplication sharedApplication] registerForRemoteNotifications]; UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; } else { // iOS version < 8 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } } 

Это содержание полезной нагрузки push:

 aps = { "content-available" = 1; somePayload = "The payload"; sound = ""; }; 

Это то, что происходит:

 1) On iOS7 when app is in the foreground -> push is delivered to the app as expected 2) On iOS7 when app is in the background -> push is delivered to the app as expected 3) On iOS8 when app is in the foreground -> push is delivered to the app as expected 4) On iOS8 when app is in the background -> push is NOT delivered to the app 5) On iOS8 when app is in the foreground and running via Xcode -> push is delivered to the app as expected 6) On iOS8 when app is in the background and running via Xcode -> push is delivered to the app as expected 

(В каждом случае didRegisterForRemoteNotificationsWithDeviceToken: получает invoked и didFailToRegisterForRemoteNotificationsWithError: нет.)

Я не знаю, если это имеет значение, но посмотрите на разницу между 4) и 6), я вижу разницу между тем, работает ли приложение через Xcode или нет.

Мой вопрос: почему push не доставляется в приложение для случая 4)? Он работает для iOS7, и AFAICT – код для регистрации удаленных уведомлений при работе на iOS8 является правильным (и действительно, он работает, если выполняется приложение через Xcode, следовательно, оно должно быть правильным), следовательно, почему он не работает, когда приложение работает независимо от Xcode на iOS8?

** ОБНОВИТЬ. После публикации щедрости для этого я пошел на форум разработчиков Apple. Кажется, у многих людей есть похожие проблемы. Для некоторых Wi-Fi должен быть включен, чтобы получить фоновые нажатия, для меня, однако, это не работает – я должен заряжать телефон, чтобы получить их. Если он не заряжается (даже если батарея заполнена), они не доставляются. Apple говорит, что они делали в отношении фонового нажатия для iOS 8, является преднамеренным, а не ошибкой, но мой вывод заключается в том, что они либо напортачили, либо сделали что-то настолько нелогичное, чтобы считаться вином. Поэтому я надеюсь, что они поймут, что они сделали, и изменили его в будущей версии.

Если вы хотите, чтобы фон перешел на соответствующий форум разработчиков и прочитал некоторые соответствующие темы.

4 Solutions collect form web for “Фоновая работа для iOS7, но не для iOS8”

Я понял, что нужно для получения удаленных уведомлений на фоне в iOS8. Apple изменила методы, необходимые для этого. Во-первых, они устарели метод registerForRemoteNotificationTypes и теперь вы должны использовать registerForRemoteNotifications . Но это не все, что меняется – вам все равно придется указывать типы разрешенных уведомлений. Вот документация ( https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/#//apple_ref/occ/instm/UIApplication/registerForRemoteNotifications ):

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

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

Попробуй это:

 [application registerForRemoteNotifications]; UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [application registerUserNotificationSettings:mySettings]; 

Он делает это!

В моих приложениях для iOS7 и iOS8 работают следующие:

 if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { // iOS 8 Notifications [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [application registerForRemoteNotifications]; } else { // iOS < 8 Notifications [application registerForRemoteNotificationTypes: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)]; } 

Надеюсь это поможет!

Попробуйте это, я обнаружил, что у меня была проблема с документацией на Яблоки, я использую Parse, и у нее есть лучший раздел для справки

 if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { [Parse setApplicationId:@"asdasd" clientKey:@"asdasd"]; UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { // Register for Push Notifications before iOS 8 [Parse setApplicationId:@"asdasd" clientKey:@"asdasd"]; [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; } 

Я думаю, вам нужно установить ключи доступа Push-уведомления.

aps-environment, получать push-уведомления в iOS

См. Эту ссылку.

  • как отправить push из iphone через городской дирижабль?
  • Как отслеживать движение друга с помощью iPhone?
  • registerusernotificationsettings не работают после использования unregisterForRemoteNotifications
  • Уведомление обозревателя iOS
  • Отправка и получение push-уведомлений через AWS SNS
  • Push-уведомление перестает работать с моим живым приложением
  • iOS push-уведомления большому числу пользователей
  • Как нажать UIViewController с файлом NIB
  • Выберите звуки для push-уведомления в моем приложении
  • Исправление информации ISS Newsstand
  • Есть ли способ запретить пользователям получать push-уведомления после их отправки из Firebase?
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.