executeFetchWithCompletionHandler никогда не будет уволен
1) Моя конфигурация plist для обеспечения backgroundmode:
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
2) В didFinishLaunchingWithOptions
Я имею:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];
3) Я объявил протокол UIApplicationDelegate
в делегате.
4) Я реализовал следующий метод, но он никогда не срабатывает. (Это работает, только если я имитирую выборку с помощью "XCode->Debug->Simulate Background Fetch".)
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
Зачем? Это бета-ошибка DP5? Должен ли я радар это?
9 ответов
Боюсь, что это сложно отладить на устройстве, потому что вы не гарантировано, что оно вызывается в указанное вами время.
setMinimumBackgroundFetchInterval
означает, что он не вызывается в интервале, который меньше указанного вами значения. Но нет setMaximumBackgroundFetchInterval
, Так что, если iOS решит вызывать ваше приложение только один раз в день или даже раз в неделю, то оно не будет вызываться чаще, независимо от вашего minimumBackgroundFetchInterval
, AFAIK iOS решает, когда позвонить performFetchWithCompletionHandler
измеряется шаблоном, когда и как часто пользователи запускают приложение.
В режиме отладки Xcode 5 вы можете вызвать фоновую выборку из меню: Debug > Simulate Background Fetch.
Есть много соображений:
Убедитесь, что возможность выбора фона была установлена в списке.
Убедитесь, что функция выборки в фоновом режиме не отключена для этого конкретного приложения или вообще в приложении "Настройки" устройства.
Обязательно установите минимальный интервал выборки.
Убедитесь, что вы грациозно покинете приложение (например, просто нажмите кнопку "Домой", запустите другое приложение и / или просто заблокируйте устройство). Но если вы убьете приложение (двойное нажатие на кнопку "Домой" и прокрутку вверх или что-то еще), это не позволит ОС предложить вашему приложению возможность запустить последующие запросы фоновой выборки (по крайней мере, до тех пор, пока пользователь снова не запустит приложение).).
Убедитесь, что вы тестируете это на физическом устройстве и не запускаете приложение через отладчик Xcode. Привязка к отладчику изменяет поведение фоновых операций.
Убедитесь, что приложение действительно выполняет некоторые сетевые запросы. Если у вас есть приложение, которое вообще не выполняет никаких сетевых запросов, оно не будет участвовать в фоновой выборке. Например, если вы используете небольшое тестовое приложение с "фоновой выборкой" и не запускаете никаких сетевых запросов, вы не будете участвовать в фоновой выборке.
Аналогично, если ОС запускает ваше приложение в фоновом режиме, чтобы оно могло выполнять фоновую выборку, если вы фактически не выполняете сетевой запрос, ОС может перестать предлагать вашему приложению возможность выполнять фоновые выборки в будущем.
Обязательно вызовите обработчик завершения и сделайте это в отведенное время, иначе ваше приложение может не участвовать в фоновой выборке в будущем.
Время, когда ОС выполняет фоновую выборку, определяется плохо документированными правилами, которые могут измениться в будущем. Но соответствующие факторы включают в себя:
Подключено ли устройство к источнику питания и / или достаточно ли заряжено;
Подключен ли к WiFi или нет;
Как часто пользователь запускает приложение;
Выполняет ли устройство другие задачи, связанные с сетью (например, может ли фоновая выборка объединяться с другими сетевыми операциями);
Как часто прошлые запросы фоновой выборки приводили к доступности данных.
По моему опыту, после первого запуска приложения, если он подключен к Wi-Fi и включается, если вы разбудите устройство примерно через 5 минут, приложение выполнит фоновую выборку. Это не жесткое и быстрое правило, а только то, что мы испытали в прошлом.Но многие новые разработчики публикуют сообщения о переполнении стека с такими вопросами, как "как я могу получить данные запроса приложения каждые х минут (или часов)", "как я могу запрашивать данные каждый день в 2 часа ночи" и т. Д. Короткий ответ: вы не может. ОС решает вопрос о времени фона на свое усмотрение. Вы не можете контролировать это (кроме минимального интервала запроса; но вы не можете контролировать максимальный интервал, поскольку ОС контролирует это).
Многим это может показаться очевидным, но убедитесь, что у вас есть надежный способ узнать, работает ли процесс фоновой выборки правильно или нет. Инфраструктура пользовательских уведомлений может использоваться для представления некоторых предупреждений, чтобы вы знали, не привел ли фоновый запрос к чему-либо. С другой стороны,
os_log
"Унифицированные уведомления" можно использовать для публикации сообщений на устройстве, которые можно отслеживать в macOSConsole
приложение. Но не раз я видел, как пользователи делают что-то вроде ожидания появления сообщения в Xcode или ожиданияUIAlertController
, Вам нужен какой-то механизм, который работает, когда не подключен к Xcode и когда приложение никогда не выходит на передний план.
(Это работает, только если я имитирую выборку с помощью "XCode->Debug->Simulate Background Fetch".)
Это потому, что вы находитесь в режиме отладки. Пожалуйста, попробуйте запустить приложение без XCode.
Используя ваше устройство вы можете стрелять application:performFetchWithCompletionHandler
со следующими шагами:
- Переведите ваше приложение в фоновое состояние
- Заблокируйте устройство и подождите 5 минут.
- Разблокируйте ваше устройство, это запустит метод
Еще одна вещь, чтобы проверить это ваш plist
файл. Убедитесь, что UIApplicationExitsOnSuspend
ключа нету.
Многие люди здесь, в Stack Overflow, рекомендуют использовать этот параметр, чтобы заставить ваше приложение запускаться заново при каждом запуске. Это работает, но побочным эффектом является то, что он предотвращает запуск новой функции фоновой выборки iOS 7.
Если application: performFetchWithCompletionHandler:
никогда не срабатывает (если вы не имитируете его с помощью XCode), проверьте также, если для вашего приложения предпочтение "Background App Refresh" установлено на "On". (Настройки приложения -> Общие -> Обновление фонового приложения)
Кроме того, выборка фона отключена, если iPhone находится в режиме низкого энергопотребления.
Apple предоставляет алгоритм, который определяет, как часто должна срабатывать фоновая выборка, исходя из вашего собственного использования приложения. Если вы часто его используете, он будет загружаться как можно чаще, но если вы используете, как в 4 часа дня, фоновая выборка должна срабатывать непосредственно перед тем, чтобы ваши данные обновлялись при запуске. Ссылка на эту ссылку