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