Ответ 1
Сначала возьмите здесь и убедитесь, что вы включили push-уведомление и добавили доступное содержимое:
Использование Push-уведомлений для запуска загрузки Если ваш сервер отправляет push-уведомления на пользовательское устройство, когда новый контент доступен для вашего приложения, вы можете попросить систему запустить ваше приложение в фоновом режиме, чтобы сразу начать загрузку нового контента. Цель этого фонового режима состоит в том, чтобы свести к минимуму количество времени, которое истекает между тем, когда пользователь видит push-уведомление и когда ваше приложение может отображать связанный контент. Приложения обычно пробуждаются примерно в то же время, когда пользователь видит уведомление, но это все равно дает вам больше времени, чем в противном случае. Чтобы поддержать этот фоновый режим, включите параметр "Удаленные уведомления" в разделе "Режимы фона" на вкладке "Возможности" в проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением удаленного уведомления в файл Info.plist ваших приложений.) Для push-уведомления для запуска операции загрузки полезная нагрузка уведомлений должна включать в себя доступный для содержимого ключ с его значением, установленным в 1. Когда этот ключ присутствует, система пробуждает приложение в фоновом режиме (или запускает его в фоновом режиме) и вызывает приложение делегатов приложения: didReceiveRemoteNotification: fetchCompletionHandler: метод. Ваша реализация этого метода должна загружать соответствующий контент и интегрировать его в ваше приложение. При загрузке любого контента рекомендуется использовать класс NSURLSession для запуска и управления загрузками. Сведения о том, как использовать этот класс для управления задачами загрузки и загрузки, см. В руководстве по программированию системы загрузки URL.
Далее, есть ли причина, по которой вы используете "dispatch_after" с задержкой в 2 секунды?
Возможно, что, так как вы вызываете "dispacth_after" к концу цикла запуска iOS "думает", нет никакой ожидающей работы и ставит процесс в спящий режим, поэтому к тому времени, когда блок отправлен, никто его не слушает.
Замена его на "dispatch_async" может решить эту проблему.
Наконец, если вам нужно задержать, вы должны сказать iOS, что вам нужно некоторое время в фоновом режиме, например:
UIApplication *application = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier __block backgroundTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
if (backgroundTaskId != UIBackgroundTaskInvalid) {
[application endBackgroundTask:backgroundTaskId];
backgroundTaskId = UIBackgroundTaskInvalid;
}
}];
Затем выполните свою фоновую работу. Не забудьте закончить задачу, когда ваша работа будет выполнена. назовите что-то вроде -
if (backgroundTaskId != UIBackgroundTaskInvalid) {
[application endBackgroundTask:backgroundTaskId];
backgroundTaskId = UIBackgroundTaskInvalid;
}