Swift - 运动分钟数 Healthkit
Swift - Exercise minutes Healthkit
所以我一直在尝试从 Healthkit 获取锻炼时间到我的应用程序并将其存储在一个变量中。
但是,只要在连接到 apple wathc 的 Iphone 上打开应用程序,它就会崩溃。我试过调试该应用程序,但它在模拟器或我的 Ipod touch 上运行良好。这是我用来检索锻炼时间的函数。
func getExerciseTime(completion: @escaping (Double) -> Void) {
let exerciseQuantityType = HKQuantityType.quantityType(forIdentifier: .appleExerciseTime)!
/*
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
*/
var now : Date
var startOfDay : Date
var predicate : NSPredicate
switch dwmValue {
case 0:
now = Date()
startOfDay = Calendar.current.startOfDay(for: now)
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
case 1:
now = Date()
startOfDay = Calendar.current.startOfDay(for: Date(timeIntervalSinceNow: -60 * 60 * 24 * 7))
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
case 2:
now = Date()
let wx = -60 * 60 * 24 * 2
startOfDay = Calendar.current.startOfDay(for: Date(timeIntervalSinceNow: TimeInterval((-60 * 60 * 24 * 7 * 4) + wx)))
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
default:
now = Date()
startOfDay = Calendar.current.startOfDay(for: now)
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
}
let query = HKStatisticsQuery(quantityType: exerciseQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum ) { (_, result, error) in
var resultCount = 0.0
guard let result = result else {
//log.error("Failed to fetch steps = \(error?.localizedDescription ?? "N/A")")
completion(resultCount)
return
}
if let sum = result.sumQuantity() {
resultCount = sum.doubleValue(for: HKUnit.count())
}
DispatchQueue.main.async {
completion(resultCount)
print("Exercise time : \(resultCount)")
}
}
healthKitStore.execute(query)
}
这是我在 viewdidAppear 中使用的代码,用于将上述函数的值存储在全局变量中
getExerciseTime(){ time in
exerciseTime = time
}
我不知道为什么应用程序总是在 Iphone 上崩溃。我试图更改 StatisticsQuery 中的选项,但没有任何效果。请帮帮我!!而且我知道 healthkit 身份验证没有问题,因为它 return 模拟器和 iPod 上的一些数据但在连接到苹果手表的 Iphone 上崩溃。
当您对数量求和时,您使用的类型不兼容 (HKUnit.count()
),您需要使用时间单位。
resultCount = sum.doubleValue(for: HKUnit.minute())
此外,如果您还没有这样做,您需要请求阅读权限
override func viewDidAppear(_ animated: Bool) {
healthKitStore.requestAuthorization(toShare: nil, read: [exerciseQuantityType], completion: { (userWasShownPermissionView, error) in
self.getExerciseTime(){ time in
self.exerciseTime = time
}
})
}
您需要在 plist 中设置使用说明
<key>NSHealthShareUsageDescription</key>
<string>Foo</string>
此外,您的应用需要在项目目标设置中设置 HealthKit 功能。
所以我一直在尝试从 Healthkit 获取锻炼时间到我的应用程序并将其存储在一个变量中。
但是,只要在连接到 apple wathc 的 Iphone 上打开应用程序,它就会崩溃。我试过调试该应用程序,但它在模拟器或我的 Ipod touch 上运行良好。这是我用来检索锻炼时间的函数。
func getExerciseTime(completion: @escaping (Double) -> Void) {
let exerciseQuantityType = HKQuantityType.quantityType(forIdentifier: .appleExerciseTime)!
/*
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
*/
var now : Date
var startOfDay : Date
var predicate : NSPredicate
switch dwmValue {
case 0:
now = Date()
startOfDay = Calendar.current.startOfDay(for: now)
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
case 1:
now = Date()
startOfDay = Calendar.current.startOfDay(for: Date(timeIntervalSinceNow: -60 * 60 * 24 * 7))
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
case 2:
now = Date()
let wx = -60 * 60 * 24 * 2
startOfDay = Calendar.current.startOfDay(for: Date(timeIntervalSinceNow: TimeInterval((-60 * 60 * 24 * 7 * 4) + wx)))
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
default:
now = Date()
startOfDay = Calendar.current.startOfDay(for: now)
predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
break
}
let query = HKStatisticsQuery(quantityType: exerciseQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum ) { (_, result, error) in
var resultCount = 0.0
guard let result = result else {
//log.error("Failed to fetch steps = \(error?.localizedDescription ?? "N/A")")
completion(resultCount)
return
}
if let sum = result.sumQuantity() {
resultCount = sum.doubleValue(for: HKUnit.count())
}
DispatchQueue.main.async {
completion(resultCount)
print("Exercise time : \(resultCount)")
}
}
healthKitStore.execute(query)
}
这是我在 viewdidAppear 中使用的代码,用于将上述函数的值存储在全局变量中
getExerciseTime(){ time in
exerciseTime = time
}
我不知道为什么应用程序总是在 Iphone 上崩溃。我试图更改 StatisticsQuery 中的选项,但没有任何效果。请帮帮我!!而且我知道 healthkit 身份验证没有问题,因为它 return 模拟器和 iPod 上的一些数据但在连接到苹果手表的 Iphone 上崩溃。
当您对数量求和时,您使用的类型不兼容 (HKUnit.count()
),您需要使用时间单位。
resultCount = sum.doubleValue(for: HKUnit.minute())
此外,如果您还没有这样做,您需要请求阅读权限
override func viewDidAppear(_ animated: Bool) {
healthKitStore.requestAuthorization(toShare: nil, read: [exerciseQuantityType], completion: { (userWasShownPermissionView, error) in
self.getExerciseTime(){ time in
self.exerciseTime = time
}
})
}
您需要在 plist 中设置使用说明
<key>NSHealthShareUsageDescription</key>
<string>Foo</string>
此外,您的应用需要在项目目标设置中设置 HealthKit 功能。