Я пытаюсь создать приложение, которое собирает пользовательские данные из HealthKit и CMMotionActivities из CoreMotion и отправляет их на сервер. Поскольку CoreMotion содержит много записей CMMotionActivity, я пытаюсь уменьшить размер данных и делиться ими с сервером как можно чаще.
Я реализовал создание отчетов с фоновой выборкой:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//other stuff
UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
return true
}
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
profile.loadUserProfile { (result) in
result.ifSuccess {
completionHandler(.newData)
}
result.ifFailure {
completionHandler(.failed)
}
}
}
func loadUserProfile(completion: @escaping (Result<Any>)->Void) {
dispatchGroup.enter()
loadUserHealthProfile() // load health data and dispatchGroup.leave()
dispatchGroup.enter()
loadUserMotionProfile() // load motion data and dispatchGroup.leave()
dispatchGroup.notify(queue: DispatchQueue.main) { [unowned self] in
self.networkingClient.report(model: self.userProfile.userData) { result in
completion(result)
}
}
}
Несмотря на то, что это работает, я не уверен, правильно ли это решение. Как я вижу в документации Apple, фоновая загрузка предназначена для загрузки обновлений в приложение, я использую ее наоборот. Существует ли правильный способ обмена данными о состоянии и движении пользователя с сервером?
UPD
Он не работает должным образом, application.isProtectedDataAvailable равен true
, пока устройство заблокировано, и я не могу запросить данные HealthKit. Единственный ли случай, когда приложение отправляет данные, когда выборка запускается, когда пользователь взаимодействует с iPhone?