HealthKit фоновая доставка выполняется много раз в минуту
Я зарегистрировался для фоновой доставки четырех типов данных HealthKit в моем делегате didFinishLaunching
метод. Типы данных: шаги, сон, тренировки и energyConsumed
,
Я заметил, что HealthKit/iOS вызывает мои запросы наблюдателей для этих типов данных много, много раз в секунду в некоторых случаях. Вот пример из некоторых журналов устройства вызываемого запроса обозревателя:
2017/03/27 07: 21: 58: 821 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:58:894 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:58:936 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:58:973 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:58:993 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07: 21: 59: 000 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:024 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07: 21: 59: 130 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:59:145 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:156 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:169 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07: 21: 59: 309 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:59:328 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:346 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:404 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:59:480 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:499 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07: 21: 59: 520 Делегат - запрос наблюдателя шагов получил новые данные
2017/03/27 07:21:59:547 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:59:561 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07: 21: 59: 571 Делегат - запрос шага наблюдателя получил новые данные
2017/03/27 07:21:59:583 Делегат - запрос шага наблюдателя получил новые данные
Вот код в моем делегате приложения, где создается этот журнал:
- (void)setUpStepsObserverQuery {
__weak typeof(self) weakSelf = self;
HKSampleType *sampleType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKObserverQuery *query = [[HKObserverQuery alloc] initWithSampleType:sampleType predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
if (completionHandler) {
completionHandler();
}
if (error) {
DDLogDebug(@"App Delegate - An error occured while setting up the stepCount observer: %@", error.localizedDescription);
} else {
DDLogDebug(@"Delegate - steps observer query received new data");
weakSelf.activityTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[weakSelf endBackgroundTask:weakSelf.activityTask];
}];
// At this point I run an anchor query to check if there really is new data, and if there is I go ahead and send the new HealthKit data to our server.
}];
[_healthStore executeQuery:query]; // _healthStore is a shared instance of HKHealthStore I created earlier
}
Вот как я включаю фоновую доставку для данных шагов. Я называю этот метод в didFinishLaunching
и он вызывает метод, который я поделился фрагментом выше, setUpStepsObserverQuery
if ([defaults boolForKey:HK_ACTIVITY_SYNC]) {
[self setUpStepsObserverQuery];
[_healthStore enableBackgroundDeliveryForType:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]
frequency:HKUpdateFrequencyImmediate
withCompletion:^(BOOL success, NSError * _Nullable error) {
DDLogDebug(@"Delegate - enabled step count background updates");
}];
Любые идеи о том, почему HealthKit будет вызывать мои запросы наблюдателя столько раз в одну минуту?
1 ответ
Это потому, что каждый раз, когда вызывается ваш запрос наблюдения, ваш didFinishLaunching
функция также называется, и enableBackgroundDeliveryForType
также вызывается, и каждый раз, когда он включается, выполняется запрос.
вы должны проверить, включена ли фоновая доставка, не включайте ее снова!
Это может быть ошибкой, а не ожидаемым поведением, поэтому вы должны подать радар в Apple.
Вы также можете попробовать указать реже HKUpdateFrequency
такие как HKUpdateFrequencyHourly
, Как указано в документации для HKHealthStore
На самом деле система предназначена для того, чтобы иметь минимальную частоту в час для типов выборки большого объема, таких как шаги и активная энергия.