"An error occurred with the `activeEnergyQuery`. The error was: Authorization not determined."

"An error occurred with the `activeEnergyQuery`. The error was: Authorization not determined."

我正在使用名为 ActivityRings 的 Apple 演示 HealthKit 应用程序。我已正确设置包标识符和权利。 iOS 应用程序和 Watch Extension 正在运行,它正在记录数据,看起来不错。应该没问题,因为我没有触及任何代码。

但是控制台日志显示,"An error occurred with the activeEnergyQuery. The error was: Authorization not determined."

正如您在报告查询和处理程序分配中看到的那样,Apple 已为打印此错误而编写。

我想知道这是干什么用的。是否有损坏的功能?

// Create a query to report new Active Energy Burned samples to our app.
    let activeEnergyQuery = HKAnchoredObjectQuery(type: activeEnergyType, predicate: predicate, anchor: nil, limit: Int(HKObjectQueryNoLimit)) { query, samples, deletedObjects, anchor, error in
        if let error = error {
            print("An error occurred with the `activeEnergyQuery`. The error was: \(error.localizedDescription)")
            return
        }
        // NOTE: `deletedObjects` are not considered in the handler as there is no way to delete samples from the watch during a workout.
        guard let activeEnergySamples = samples as? [HKQuantitySample] else { return }
        sampleHandler(activeEnergySamples)
    }

    // Assign the same handler to process future samples generated while the query is still active.
    activeEnergyQuery.updateHandler = { query, samples, deletedObjects, anchor, error in
        if let error = error {
            print("An error occurred with the `activeEnergyQuery`. The error was: \(error.localizedDescription)")
            return
        }
        // NOTE: `deletedObjects` are not considered in the handler as there is no way to delete samples from the watch during a workout.
        guard let activeEnergySamples = samples as? [HKQuantitySample] else { return }
        sampleHandler(activeEnergySamples)
    }

    currentQuery = activeEnergyQuery
    healthStore.executeQuery(activeEnergyQuery)
}

func endWorkoutOnDate(endDate: NSDate) {
    workoutEndDate = endDate

    workoutButton.setTitle("Begin Workout")
    activeEnergyBurnedLabel.setText("0.0")

    if let query = currentQuery {
        healthStore.stopQuery(query)
    }

    saveWorkout()
}

requestAuthorizationToShareTypes 函数

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user.
    super.willActivate()

    // Only proceed if health data is available.
    guard HKHealthStore.isHealthDataAvailable() else { return }

    // We need to be able to write workouts, so they display as a standalone workout in the Activity app on iPhone.
    // We also need to be able to write Active Energy Burned to write samples to HealthKit to later associating with our app.
    let typesToShare = Set([
        HKObjectType.workoutType(),
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!])

    let typesToRead = Set([
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!])

    healthStore.requestAuthorizationToShareTypes(typesToShare, readTypes: typesToRead) { success, error in
        if let error = error where !success {
            print("You didn't allow HealthKit to access these read/write data types. In your app, try to handle this error gracefully when a user decides not to provide access. The error was: \(error.localizedDescription). If you're using a simulator, try it on a device.")
        }
    }
}

AppDelegate.swift

import UIKit
import HealthKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
let healthStore: HKHealthStore = HKHealthStore()

func applicationShouldRequestHealthAuthorization(application: UIApplication) {
    healthStore.handleAuthorizationForExtensionWithCompletion { success, error in
        if let error = error where !success {
            print("You didn't allow HealthKit to access these read/write data types. In your app, try to handle this error gracefully when a user decides not to provide access. The error was: \(error.localizedDescription). If you're using a simulator, try it on a device.")
        }
    }
}
}

您的应用需要请求授权才能读取和写入活性能量样本。在用户选择是否授权您的应用之前,授权将为 "not determined"。有关使用 requestAuthorizationToShareTypes:readTypes:completion:.

请求授权的更多信息,请参阅 HKHealthStore documentation

您是否设置了 iOS 应用程序来处理手表应用程序的 healthkit 授权?当您从 Apple Watch 请求使用 healthkit 类型的权限时,您的 iOS 应用程序上会显示一个权限对话框。但是,您需要告诉您的 iOS 应用您希望 Apple Watch 请求它。您可以使用 AppDelegate 文件中的以下代码执行此操作:

func applicationShouldRequestHealthAuthorization(application: UIApplication) {
    let healthStore = HKHealthStore()
    healthStore.handleAuthorizationForExtensionWithCompletion { (success, error) -> Void in
        //...
    }
}

请注意,数据可以直接从手表的传感器(如心率和燃烧的卡路里)发送到 healthkit,无需您的应用程序的许可。听起来您的权限错误是因为您正在尝试读取数据(您还没有权限)。