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 功能。