Подтвердить что ты не робот

ВыполнитьFetchWithCompletionHandler никогда не запускается

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? Должен ли я радар это?

4b9b3361

Ответ 1

Я боюсь, что это сложно отлаживать на устройстве, потому что вам не гарантировано, что он вызывается в течение указанного вами времени.

setMinimumBackgroundFetchInterval означает, что он не вызывается в интервале, который меньше указанного вами значения. Но там нет setMaximumBackgroundFetchInterval. Поэтому, если iOS решает позвонить в ваше приложение только один раз в день или даже раз в неделю, а не будет вызываться чаще, чем ваш minimumBackgroundFetchInterval. AFAIK iOS решает, когда вызывать performFetchWithCompletionHandler, измеренную шаблоном, когда и как часто пользователи запускают приложение.

Ответ 2

В режиме отладки Xcode 5 вы можете принудительно извлечь фоновый выбор из меню: Debug > Simulate Background Fetch.

Ruff!

Ответ 3

(Он работает только, если я имитирую выборку с помощью "XCode- > Debug- > Simulate Фоновая выборка".)

Это потому, что вы находитесь в режиме отладки. Попробуйте запустить приложение без XCode.

Ответ 4

Используя ваше устройство, вы можете запустить application:performFetchWithCompletionHandler с помощью следующих шагов:

  • Поместите приложение в состояние "Фон"
  • Заблокируйте устройство и подождите 5 минут.
  • Разблокируйте устройство, это вызовет метод

Ответ 5

Существует много соображений:

  • Убедитесь, что функция фоновой выборки установлена ​​в plist.

  • Убедитесь, что функция фоновой выборки не была отключена для этого конкретного приложения или, вообще, в приложении Настройки устройства.

  • Обязательно установите минимальный интервал выборки.

  • Убедитесь, что вы изящно покинули приложение (например, просто нажмите кнопку "домой" и запустите другое приложение и/или просто заблокируйте устройство). Но если вы убьете приложение (двойное нажатие на кнопку "домой" и прокрутка вверх или что у вас есть), что помешает ОС предлагать вашему приложению возможность отключить последующие запросы на выборку фона (по крайней мере, пока пользователь не запустит приложение снова).

  • Убедитесь, что вы тестируете это на физическом устройстве и не запускаете приложение через отладчик Xcode. Привязка к отладчику изменяет поведение фоновых операций.

  • Убедитесь, что приложение действительно выполняет некоторые сетевые запросы. Если у вас есть приложение, которое вообще не выполняет сетевых запросов, оно не будет участвовать в фоновом извлечении. Если вы делаете, например, небольшое тестовое приложение с "извлечением фона" и не выдаете сетевых запросов, вы не будете участвовать в фоновом извлечении.

    Аналогично, если ОС запустит ваше приложение в фоновом режиме, чтобы он мог выполнять фоновое извлечение, если вы фактически не выполняете сетевой запрос, ОС может перестать предлагать вашему приложению возможность выполнять фоновые настройки в будущем,

  • Обязательно вызовите обработчик завершения и сделайте это в течение отведенного времени, или ваше приложение может не участвовать в фоновом извлечении в будущем.

  • Время, в течение которого ОС выполняет фоновый выбор, продиктовано плохо документированными правилами, которые могут измениться в будущем. Но соответствующие факторы включают:

    • Подключено ли устройство к мощности и/или достаточно заряжено,

    • Подключен ли к Wi-Fi или нет;

    • Как часто пользователь запускает приложение,

    • Является ли устройство другими сетевыми задачами (например, может ли фоновая выборка быть объединена с другими сетевыми операциями),

    • Как часто прошлые запросы на выборку фона приводили к доступности данных.


    По моему опыту, после того, как приложение запускается в первый раз, если подключено к Wi-Fi и мощности, если вы пробудете устройство примерно через 5 минут, приложение выполнит фоновое извлечение. Это не сложное и быстрое правило, а то, что мы пережили в прошлом.

    Но многие новые разработчики публикуют в Qaru с такими вопросами, как "как я могу получать данные запроса приложения каждые x минут (или часов)", "как я могу запрашивать данные каждый день в 2 часа ночи" и т.д. Короткий ответ что вы не можете. ОС решает время фона по своему усмотрению. Вы не можете управлять этим (кроме минимального интервала запроса, но вы не можете контролировать максимальный интервал, поскольку ОС управляет этим).

  • Это может показаться многим очевидным, но убедитесь, что у вас есть надежный способ узнать, работает ли процесс извлечения фона правильно или нет. Рамка уведомлений пользователей может использоваться для представления некоторого предупреждения, чтобы вы знали, что в результате фонового запроса что-то появилось. В качестве альтернативы, os_log "Унифицированные уведомления" могут использоваться для публикации сообщений на устройстве, которое можно отслеживать в приложении macOS Console. Но не раз я видел, что пользователи делают что-то вроде ожидания появления сообщения в Xcode или ожидания UIAlertController. Вам нужен какой-то механизм, который работает, когда он не подключен к Xcode и когда приложение никогда не выходит на передний план.

Ответ 6

Еще одна вещь, которую нужно проверить, - это ваш файл plist. Убедитесь, что кнопка UIApplicationExitsOnSuspend отсутствует.

Многие люди здесь, в Stack Overflow, рекомендовали использовать этот параметр в качестве способа заставить ваше приложение запускаться при каждом запуске. Это работает, но побочный эффект заключается в том, что он предотвращает запуск новой функции fetch fetch iOS 7.

Ответ 7

Если application: performFetchWithCompletionHandler: никогда не запускается (если вы не имитируете его с помощью Xcode), проверьте также, если предпочтение "Обновление фонового приложения" "On" для вашего приложения. (Приложение настроек → Общие → Обновление фонового приложения)

Ответ 8

Кроме того, фоновая выборка отключена, если iPhone находится в режиме с низким энергопотреблением.

Ответ 9

Apple предоставляет алгоритм, который определяет, как часто фоновая выборка должна запускаться, основываясь на вашем собственном использовании приложения. Если вы используете его много, то он будет извлекаться как можно чаще, но если вы используете как в 4 часа дня каждый день, фоновая выборка должна запускаться раньше, поэтому ваши данные обновляются при запуске. Отправьте ссылку