Как да принудите HKQuery да зареди броя на най-новите стъпки?

В момента се опитвам да използвам HKStatisticsQuery, за да получа броя на стъпките между определен интервал от време. Аз сам правя тест от shaking телефона. Въпреки това изглежда, че резултатът, който получавам, не е най-новият, освен ако:

  1. Отварям Health.app, поддържам го да работи във фонов режим и правя теста отново в моето приложение;
  2. Отварям UP app, поддържам го да работи във фонов режим и правя теста отново в моето приложение.

И ако принудително изляза от Health.app илиUP app, приложението ми няма да може да получи отново най-новите данни. Така че UP трябва да прави нещо, което ми липсва, но не мога да намеря, че има някакъв метод като „презареждане“ в HKHealthStore или каквито и да било свързани опции в HKQuery/HKStatisticsQuery.

Кодът, който използвам, е доста прав, както е показано по-долу. Чудя се дали има някакви разрешения или нещо, което ми липсва.

    let predicate = HKQuery.predicateForSamplesWithStartDate(date_start, endDate: NSDate(), options: HKQueryOptions.StrictStartDate)
    var type = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
    var query = HKStatisticsQuery(quantityType: type,
        quantitySamplePredicate: predicate,
        options: .CumulativeSum | .SeparateBySource,
        completionHandler: { query, stats, error in ( /*logs here*/ ) })
    let healthStore = HKHealthStore()
    healthStore.executeQuery(query)

Редактиране: Опитах се също да запиша някои данни в HealthKit, но заявката не се актуализира.

Edit2: когато казах "последните стъпки се броят", имах предвид нещо като: 1. изпълнете HKQuery; 2. разклащам телефона; 3. изпълнете отново HKQuery. Пускам кода по-горе 2 пъти и винаги получавам едни и същи резултати, но ако оставя Health.app или приложението UP на заден план, последната заявка получава актуализираните резултати.

Също така се опитах да извикам някои други API като:

    healthStore.enableBackgroundDeliveryForType(type, frequency:.Immediate, withCompletion:{
        (success:Bool, error:NSError!) -> Void in
        let authorized = healthStore.authorizationStatusForType(type)
        LF.log("HEALTH callback success", success)
        LF.log("HEALTH callback authorized", type)
    })

    if HKHealthStore.isHealthDataAvailable() == false {
        LF.log("HEALTH data not available")
        return
    } else {
        LF.log("HEALTH OK")
    }

Почти без причина, но се опитайте тайно да „задействате“ някакъв вид опресняване на фона. Но нито един от тези опити не успя.


person superarts.org    schedule 01.12.2014    source източник


Отговори (1)


HealthKit не винаги разполага с актуален брой стъпки и изминато разстояние на потребителя. Той импортира тези стойности, които всъщност идват от CoreMotion.framework, периодично и в отговор на определени събития. Ако работещо приложение има отворен HKObserverQuery или HKStatisticsCollectionQuery, тогава HealthKit ще предава стойностите към клиента, но в противен случай пробите са само моментна снимка от последното импортиране.

Така че, ако искате да наблюдавате промени за примерен тип, трябва да се абонирате за актуализации с помощта на HKObserverQuery и след това да потърсите отново HealthKit за най-новите стойности. По-ефективен подход обаче би бил да се използва HKStatisticsCollectionQuery, който обаче има манипулатор за актуализиране, който ще бъде извикан, когато статистиката за пробите, съответстващи на предикатите, се промени.

И накрая, ако се интересувате само от актуален брой стъпки или изминато разстояние за най-много последните 7 дни, препоръчвам ви да обмислите използването на CoreMotion.framework директно вместо това.

person Allan    schedule 02.12.2014
comment
Съжалявам, че не го казах ясно. Обаждам се на HKStatisticsQuery няколко пъти, когато изгледът се презарежда (viewWillAppear). - person superarts.org; 03.12.2014
comment
Схванах го. Ще променя отговора си, за да бъда по-полезен в този случай. - person Allan; 05.12.2014
comment
Благодаря! Мисля, че това е грешка на Apple, но HKStatisticsCollectionQuery с statisticsUpdateHandler свърши работа. - person superarts.org; 05.12.2014