HKWorkoutSession не работает последовательно - PullRequest
0 голосов
/ 01 мая 2018

в watchOS, я просто пытаюсь получить значение ЧСС в режиме реального времени, пока выполняется сеанс тренировки.

func startHeartRateQuery(updateHandler: @escaping ([HKQuantitySample]?) -> Void) {
    guard let quantityType = HKObjectType.quantityType(forIdentifier: .heartRate) else {
        return
    }

    let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in
        guard let newAnchor = newAnchor else {return}
        self.anchor = newAnchor
        updateHandler(sampleObjects as? [HKQuantitySample])
    }

    heartRateQuery.updateHandler = {(query, samples, deleteObjects, newAnchor, error) -> Void in
        self.anchor = newAnchor!
        updateHandler(samples as? [HKQuantitySample])
    }

    healthStore.execute(heartRateQuery)
    activeDataQueries.append(heartRateQuery)
}

И вот как я начинаю тренировку.

func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
    guard let d = delegate else {
        return
    }

    if let u = userInfo["status"] as? String {
        d.receivedWorkoutRunningStatus(u)
    }

    if let c = userInfo["clock"] as? String {
        d.receiveWorkoutRestPeriodClock(c)
    }
}

Вы можете найти функцию полученныйWorkoutRunningStatus в InterfaceController. Это InterfaceController.swift, который является первым экраном приложения Watch.

class InterfaceController: WKInterfaceController, HKWorkoutSessionDelegate {

@IBOutlet var lblHeartRate: WKInterfaceLabel!
@IBOutlet var lblSplitIntervalNumber: WKInterfaceLabel!
@IBOutlet var lblRestPeriodClock: WKInterfaceLabel!

private let healthStoreManager = WatchHealthKitManager()
private let parentConnector = ParentConnector()
private var workoutSession: HKWorkoutSession!

override func awake(withContext context: Any?) {
    super.awake(withContext: context)

    // Create a workout session with the workout configuration
    do {
        let workoutConfiguration = HKWorkoutConfiguration()
        workoutConfiguration.locationType = .indoor
        workoutConfiguration.activityType = .rowing

        workoutSession = try HKWorkoutSession(configuration: workoutConfiguration)
    } catch {
        fatalError(error.localizedDescription)
    }

    //// initial setup
    parentConnector.activate()
    parentConnector.delegate = self
    workoutSession.delegate = self
}    
// MARK: - Data Accumulation

private func startAccumulatingData() {
    healthStoreManager.startHeartRateQuery() { quantitySamples in
        DispatchQueue.main.async {
            guard !self.isPaused() else {
                return
            }

            guard let heartRateSamples = quantitySamples else {
                return
            }

            let hrUnit = HKUnit(from: "count/min")
            guard let sample = heartRateSamples.first else {
                return
            }

            let value = sample.quantity.doubleValue(for: hrUnit)
            self.updateHeartRate(value: value)
            self.parentConnector.transfer(value: value)
        }
    }
}

func workoutSession(_ workoutSession: HKWorkoutSession,
                    didChangeTo toState: HKWorkoutSessionState,
                    from fromState: HKWorkoutSessionState,
                    date: Date) {
    switch (toState) {
    case .running:
        startAccumulatingData()
    case .ended:
        stopAccumulatingData()
    default:
        print("Error")
    }
}
func receivedWorkoutRunningStatus(_ status: String) {
    if (status == "Start") {
        healthStoreManager.start(workoutSession)
    } else if (status == "Finish") {
        healthStoreManager.end(workoutSession)
        lblHeartRate.setText("No Active Workout")
    }

    DispatchQueue.main.async {
        self.lblSplitIntervalNumber.setText(status)
    }
}

В приложении для iPhone я отправляю строку «Start» с помощью функции TransferUserInfo, чтобы запустить начало тренировки. Это не работает должным образом, это только иногда работает, это очень противоречиво.

Буду признателен, если у вас есть какие-либо советы или альтернативные подходы.

Заранее спасибо.

...