我正在尝试制作一个应用程序,该应用程序从HealthKit收集用户数据,并从CoreMotion收集CMMotionActivities并将其发送到服务器。由于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交互时触发获取操作吗?