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 такие как HKUpdate​Frequency​Hourly, Как указано в документации для HKHealthStoreНа самом деле система предназначена для того, чтобы иметь минимальную частоту в час для типов выборки большого объема, таких как шаги и активная энергия.

Другие вопросы по тегам