Загрузка iPhone для iPhone
Я делаю приложение, которое получает постоянные обновления (потенциально сотни раз в день) и, чтобы улучшить восприятие пользователей, было бы неплохо, если бы они были загружены в фоновом режиме.
Глядя на документацию Apple [ 1 ], мне нужно установить фоновый режим на «Фоновая выборка». Изучая глубже, вы можете прочитать о application:performFetchWithCompletionHandler
[ 2 ], которая гласит, что:
Когда этот метод вызывается, ваше приложение имеет до 30 секунд времени настенных часов для выполнения операции загрузки и вызова указанного блока обработчика завершения … Если вашему приложению требуется много времени, чтобы вызвать обработчик завершения, он может быть указан меньше возможностей для получения данных в будущем.
Проблема заключается в том, что загрузка будет занимать более 30 секунд, и, как таковая, скорее не столкнется с яростью Apple, отправляющей обновления все меньше и меньше между ними, тем самым усугубляя проблему!
Итак, могу ли я как-то это сделать?
Кроме того, я создал грубый эксперимент, в котором я создаю NSTimer:scheduledTimerWithTimeInterval
для запуска каждую минуту, которая входит в консоль. Это успешно работает как на iPhone в симуляции (работает в течение 30 минут плюс), так и когда я размещаю его на телефоне (неделю плюс) … почему бы это быть !?
- Swift - UISearchController с отдельным поискомResultsController
- Xcode Swift Возврат к предыдущему viewController (TableViewController)
- iOS передает данные из таблицы в новый вид
- Не удалось создать представление Swift
- Xcode - получение списка всех заголовков методов
- Я получаю сообщение об ошибке «Контроль может дойти до конца ошибки не-void» в библиотеке gRPC в Xcode
- Недостаточно памяти в XCode, но не в Инструментах
- Что такое символы отладки в xcode
Это может быть трудно сделать из-за обязательства Apple 30s. Они решили так, чтобы в конечном итоге предотвратить большую загрузку, чтобы не разрядить батарею и план данных.
Вы должны быть уверены, что вам действительно нужно загрузить столько данных (так как это занимает много времени) в фоновом режиме, плюс сто раз в день!
Я имею в виду, когда ваше приложение выходит на передний план после (длительного) фона, оно может не обновляться, и это нормальный случай. Поэтому вам нужно сделать обновление, когда приложение выходит на передний план; требуется только одно обновление. В противном случае вам следует отступить и переосмыслить процесс обновления.
Найдено решение:
Вы можете обойти application:performFetchWithCompletionHandler
Apple application:performFetchWithCompletionHandler
и установить собственный таймер. Для этого необходимо выполнить следующие действия:
-
Выберите «
Background fetch
разделе «Настройки приложения»> «Возможности»> «Фоновые режимы». -
В
AppDelegate.m
, вapplication:didFinishLaunchingWithOptions
, добавьте следующий код:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ // Nothing }];
-
Теперь вы можете добавить
NSTimer
в свойAppDelegate
и он будет продолжать работать в фоновом режиме. Например,_timerBg = [NSTimer scheduledTimerWithTimeInterval:1800 target:self selector:@selector(bgFunction) userInfo:nil repeats:YES];