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-awoken? Создается ли экземпляр 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