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

iOS: использование завершения фонового обновления HKObserverQueryHandler

HKObserverQuery имеет следующий метод, который поддерживает получение обновлений в фоновом режиме:

- initWithSampleType:predicate:updateHandler:

updateHandler имеет completionHandler со следующей документацией:

Этот блок передается в обработчик обновлений. Вы должны назвать этот блок как только вы закончите обработку входящих данных. Называя это блок сообщает HealthKit, что вы успешно получили фоновые данные. Если вы не вызываете этот блок, HealthKit продолжает попытаться запустить ваше приложение, используя алгоритм отката. Если ваше приложение HealthKit предполагает, что ваше приложение не может ответить три раза получать данные и перестает отправлять вам фоновые обновления.

Глядя на другие посты, кажется, что вокруг этого обработчика много путаницы. Ниже приведены некоторые вопросы, которые у меня есть по этому поводу:

  • Когда должен вызываться обработчик? Если вызвать слишком поздно, то HK может подумать, что приложение никогда не получало обновление запроса, в результате чего вы нажали на алгоритм фонового обновления с 3 ударами. В документации говорится, что он должен вызываться после обработки других запросов. В зависимости от того, сколько времени потребуется для выполнения этих запросов, может показаться, что вы опасно приблизились к ударам фонового обновления.
  • Зачем это нужно? Разве система не должна знать, что приложение было запущено и получило фоновое обновление? При использовании CoreBluetooth в фоновом режиме приложение просто просыпается в фоновом режиме на 10 секунд. Нет необходимости вызывать какой-либо обработчик или заниматься фоновым обновлением 3-страйков.
  • Если вы нажмете на фоновое обновление 3 удара, и HK прекратит отправку обновлений, это постоянно? HK когда-нибудь снова начинает отправлять фоновые обновления? Что делать, если есть ошибка, которая препятствовала вызову обработчика, и теперь вы это исправили. Приложение застряло, никогда не получая обновления? Или он будет сброшен при повторном запуске или обновлении приложения?
  • Поддерживает ли HK ваше приложение в фоновом режиме, пока не будет вызван обработчик? Это часть его цели или просто побочный эффект? Если это часть его цели, как долго мы сможем бежать, прежде чем остановиться (и ударить по первому удару фонового обновления)?
4b9b3361

Ответ 1

  Когда должен вызываться обработчик?

Позвони после того, как сделаешь свою работу. Ваш код не должен выполнять сложные операции. Приложение находится в фоновом режиме и пользователь не видит, что изменилось. Вы можете просто установить "флаг", что данные обновляются и выполнять сложные операции после того, как пользователь запустил приложение. Если ваше решение об уведомлении пользователя либо не основано на сложных операциях, то попытайтесь провести рефакторинг кода, чтобы все необходимые данные были предварительно рассчитаны (например, в UserDefaults), и дополнительные данные просто извлекались из этих данных. Таким образом, 1-2 секунды достаточно для вашего расчета.

Зачем это нужно?

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

Если вы нажмете на фоновое обновление 3 удара, и HK прекратит отправку обновлений, это постоянно?

Номер

HK когда-нибудь снова начинает отправлять фоновые обновления?

Да. Но это зависит от многих факторов. Он может попытаться снова вызвать ваше приложение через 1-2 дня. Если ничего не изменится, это будет называться редко.

Поддерживает ли HK ваше приложение в фоновом режиме, пока не будет вызван обработчик?

Это неизвестно. Это зависит от многих факторов. Возможно, если iPhone заряжается, это позволит запустить ваше приложение дольше, чтобы оценить, вызван ли указатель завершения или нет. Если ваш iPhone не заряжается и батарея заряжена на 0%, то, скорее всего, iOS убьет ваше приложение. Таким образом, вы не должны выполнять какую-либо работу после вызова обработчика завершения. И постарайся сделать это простым.

Рекомендации

Вы должны обработать новые данные как можно быстрее. Если вам нужно получить много данных, попробуйте оптимизировать их и предварительно рассчитать, когда приложение находится на переднем плане, затем сохранить где-нибудь (UserDefault) и использовать новые данные с кэшированными данными для принятия решения (например, уведомить пользователя о что-то; я думаю, вам нужны фоновые обновления именно для этого).

1-2 секунды или меньше - хорошее время для фоновых обновлений.