Apple HealthKit - фоновите актуализации не се задействат

Опитвам се да изпълня някои действия, задействани от промени в Apple Health Kit, задействани във фонов режим на моето приложение Swift за iOS.

Ето моят AppDelegate:

var healthManager : HealthManager?


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


    healthManager = HealthManager.sharedInstance


    return true
}

И при инициализирането на класа HealthManager разрешавам използването на Health Kit и извиквам:

    var sampleType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
    var predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.StrictStartDate)
    var query = HKObserverQuery(sampleType: sampleType, predicate: predicate, updateHandler: stepsChangedHandler)

    healthKitStore.executeQuery(query)
    healthKitStore.enableBackgroundDeliveryForType(sampleType, frequency: .Immediate, withCompletion: {(succeeded, error) in
        if succeeded {
            println("Enabled background delivery of step changes")
        } else {
            if let theError = error {
                print("Failed to enable background delivery of step changed. ")
                println("Error = \(theError)")
            }
        }
    })

Това работи прекрасно, когато приложението е отворено - stepsChangedHandler се извиква, когато има актуализация на комплект за здраве, но когато приложението е извън фокус, то никога не се извиква. Търсих наоколо и намерих няколко идеи, но нито една от корекциите не изглежда да работи за мен.

Благодаря!


person michael5w    schedule 30.06.2015    source източник
comment
И аз се чудя как да направя това успешно. Някой знае ли жизнения цикъл на приложение за фоново приложение, пробудено от HealthKit? Инстанцира ли се appdelegate? Започвам да мисля, че се изпълнява САМО updateHandler за заявката за наблюдател.   -  person barnone    schedule 30.06.2015
comment
@barnone - Поставих println в updateHandler, за да видя дали нещо се случва във фонов режим, но никога не се показва на конзолата на Xcode, но може би те не работят по този начин?   -  person michael5w    schedule 30.06.2015
comment
@barnone - Публикувах отговор, обясняващ жизнения цикъл тук: stackoverflow.com/questions/31117630/   -  person goldengil    schedule 07.10.2015
comment
@goldengil благодаря. и аз го накарах да работи. Предполагам, че по-големият проблем с картината е... повечето от тези актуализации се случват, когато телефонът е заключен (и така данните не могат да бъдат изтеглени). Някакви идеи как можете да кажете на iPhone да опита отново, след като бъде отключен?   -  person michael5w    schedule 08.10.2015
comment
Вижте отговора ми тук: stackoverflow.com/a/35073904/1677480   -  person damirstuhec    schedule 29.01.2016


Отговори (2)


Това, което имате, трябва да работи, но моят опит със симулатора до iOS 8.4 и Xcode 6.4 е, че фоновите актуализации не се задействат. При моето тестване обаче това работи на устройство. За да опитате сами, свържете и стартирайте приложението си на устройство, след което превключете към Health.app и добавете подходяща точка от данни.

Ако вашата заявка е настроена за незабавни актуализации, трябва да видите вашето лог съобщение в конзолата. Уверете се, че stepsChangedHandler включва completionHandler().

Според документите, заявката се изпълнява на отделна фонова нишка, така че кодът ви за делегат на приложение ще бъде извикан само при първоначално стартиране.

person zjames    schedule 16.07.2015

В документацията за класа HKHealthStore, под enableBackgroundDeliveryForType:... има параграф:

Някои типове данни, като броя на стъпките, имат минимална честота HKUpdateFrequencyHourly. Тази честота се налага прозрачно.

което обяснява защо няма да виждате фонови актуализации толкова често, колкото сте посочили. Не съм сигурен дали има списък на това кои типове данни са включени в квантора „някои“.

person Jeff    schedule 28.10.2015