【问题标题】:How to keep iwatch app active to transfer motion & health data如何保持 iwatch 应用程序处于活动状态以传输运动和健康数据
【发布时间】:2022-12-14 19:33:53
【问题描述】:

我正在开发一个需要加速度计、陀螺仪和计步器数据以及心率的应用程序。我正在将此数据从 iwatch 传输到 iPhone,然后从 iPhone 我需要通过 MQTT 协议同步此数据。现在我的问题是,一旦 iwatch 窗口禁用,我的应用程序就会终止。我正在使用核心运动和现场锻炼课程。 任何人都可以帮助我如何保持 iwatch 应用程序处于活动状态或从非活动模式传输上述数据?

【问题讨论】:

    标签: ios swift xcode healthkit watchos


    【解决方案1】:

    这是我的解决方案,可以帮助您:

    参考:https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings/running_workout_sessions

    1. 设置HKWorkoutSessionCoreMotion监听器
      import WatchKit
      import Foundation
      import CoreMotion
      import HealthKit
      
      enum VelocityVector: Int {
          case x, y, z
      }
      
      class InterfaceController: WKInterfaceController {
      
          @IBOutlet weak var labelVelocity: WKInterfaceLabel!
          let coreMotion = CMMotionManager.init()
          let pool = OperationQueue.init()
          let currentSession: HKWorkoutSession?
          let healthKit = HKHealthStore()
          
          override func awake(withContext context: Any?) {
              coreMotion.accelerometerUpdateInterval = 0.1
              coreMotion.startAccelerometerUpdates(to: pool) { data, err in
                  guard let _data = data else { return }
                  DispatchQueue.main.async {
                      self.labelVelocity.setText(String.init(format: "G-Force (x:y:z) %.3f:%.3f:%.3f", arguments: [_data.acceleration.x, _data.acceleration.y, _data.acceleration.z]))
                  }
              }
              
              let config = HKWorkoutConfiguration.init()
              config.activityType = .other
              config.locationType = .unknown
              
              do {
                  self.currentSession = try HKWorkoutSession.init(healthStore: self.healthKit, configuration: config)
                  self.currentSession?.startActivity(with: Date())
              } catch error {
                  print(error?.localizedDescription)
              }        
          }
      
          private func stopHKWorkoutSession() {
              self.currentSession?.stopActivity(with: Date())
              self.currentSession?.end()
          }
          
          override func willActivate() {
              // This method is called when watch view controller is about to be visible to user
          }
          
          override func didDeactivate() {
              // This method is called when watch view controller is no longer visible
          }
      
      }
      
      1. 在后台模式下启用“锻炼处理”:

    【讨论】:

    • 感谢@Neklas 分享您的回答,我已经这样做了,但不知何故,会话在一段时间后结束了。
    • @Naresh 请检查您的崩溃日志或可以帮助您了解应用程序运行期间发生的事情的内容。因为我也在开发健康追踪应用程序。它具有带身体运动检测的睡眠跟踪。它可以在后台持续运行 8-10 小时。您可以通过实现其委托来获取锻炼错误事件:developer.apple.com/documentation/healthkit/… Ex:func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error)
    • 根据苹果开发人员的说法,我们可以在 iwatch 中进行一次锻炼,那么您是否使用默认活动和锻炼应用程序做了一些事情?
    • 来自文档:“Apple Watch 一次运行一个锻炼会话。如果在您的锻炼运行时开始第二次锻炼,您的 HKWorkoutSessionDelegate 对象会收到 HKError.Code.errorAnotherWorkoutSessionStarted 错误,并且您的会话结束。”如果你运行新的 HKWorkoutSession,当前的将被停止。所以你也需要控制它。或者,您可以使用 WKExtendedRuntimeSession,但对于 [Physical Therapy] 类型,应用程序可以运行的最长后台时间为 1 小时。参考:developer.apple.com/documentation/watchkit/…
    • 如果您不需要 HR 不断更新,您可以启动后台位置更新。它将使您的应用程序在后台运行以继续执行代码。在将精度设置为 Low(如 1000 米)并将 distanceFilter 设置为 3000 米后调用 startUpdatingLocation(),以减少电池消耗。
    【解决方案2】:

    是否可以直接从手表将 heartkit 数据发送到服务器,而无需伴侣(iphone)......?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多