HealthKit后台投递在一分钟内运行多次

时间:2017-03-27 06:03:21

标签: ios iphone health-kit

我已在我的委托的didFinishLaunching方法中注册了四种类型的HealthKit数据的后台交付。数据类型包括步骤,睡眠,锻炼和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委托 - 步骤观察者查询收到新数据

以下是我的app delegate中创建此日志的代码:

- (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会在同一分钟内多次调用我的观察者查询?

2 个答案:

答案 0 :(得分:1)

这是因为每次调用观察查询时,也会调用didFinishLaunching函数,并且也会调用enableBackgroundDeliveryForType,并且每次启用该查询时,都会执行该查询。

您必须检查是否启用了后台传送,请不要再次启用!

答案 1 :(得分:0)

这可能是一个错误而不是预期的行为,因此您应该使用Apple提交雷达。

您还可以尝试指定频率较低的HKUpdateFrequency,例如HKUpdate​Frequency​Hourly。正如HKHealthStore try { JSONObject mainObject = new JSONObject(String.valueOf(result)); JSONArray place= mainObject.getJSONArray("place"); for(int i=0;i<place.length();i++) { JSONObject object= place.getJSONObject(i); JSONObject finalObject= object.getJSONObject("address"); String country= finalObject.getString("country"); String state= finalObject.getString("state"); Log.e("values",country+" "+state); } }catch(JSONException e) { e.printstacktrace(); } 中提到的那样,系统实际上是针对高容量样本类型(例如步数和活动能量)具有每小时的最小频率。