有没有办法让我的 WatchKit 应用程序 运行 在后台运行?

is there anyway to keep my WatchKit app running in the background?

我是 swift 和 WatchKit 的新手 framework.I 正在研究这个 month.Now 我的问题 is:is 可能 运行 一个应用程序在 Apple Watch 的后台模式下?我从文档中读到 WatchKit 扩展不支持后台执行 modes.But 如果这是真的如何运行健康应用程序之类的应用程序?我的意思是,手表上有一个应用程序称为健康,即使该应用程序不在 foreground.I 中,它也会在每个时刻占用您的炉速,它会做更多相同的事情,或者 less.In 我的应用程序,我只会在用户移动时检测到用户加速即使应用程序不在 foreground.How 中也可以观看吗?请向 post 我提供必要的文档,以便 so.Thanks 做很多事情!

Ps。对不起我的英语不好!

在 watchOS 3 中,锻炼应用程序可以 运行 在后台运行。我没有个人经验,但请查看 WWDC 2016 视频 Building Great Workout Apps

是的,你可以。有几种方式:

  1. 使用 HKWorkoutSession 开始锻炼 - 最强大的方式,但是您需要使用 HealthKit 并且 Apple Watch 上只有 1 个应用程序可以 运行 这种方式。
  2. 使用 WKAudioFilePlayer 在后台播放音频 - 仅适用于音频。
  3. WKURLSessionRefreshBackgroundTask适合短时间后台刷新。
  4. 还有其他后台任务,例如WKSnapshotRefreshBackgroundTaskWKURLSessionRefreshBackgroundTask。它们列在 this article.
  5. 的后台任务部分
  6. performExpiringActivity(withReason:using:)可用于在应用程序进入后台时短暂延长应用程序的寿命。

另请阅读Leveraging iOS Technologies

我也遇到了同样的问题。我想在应用程序处于后台模式时执行一些代码。我已经解决了这个问题。我发现了一种额外的状态,在这种状态下,我的手表应用程序将在后台继续 运行,不需要 HKWorkoutSession 或上面讨论的任何其他解决方案。只需按照以下步骤

  1. 进口CoreLocation
  2. 在class
  3. 中添加CLLocationManagerDelegate
  4. willActive方法中添加以下代码。

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    if #available(watchOSApplicationExtension 3.0, *) {
        locationManager.startUpdatingLocation()
    } else {
        // Fallback on earlier versions
    }
    
    if #available(watchOSApplicationExtension 4.0, *) {
        locationManager.allowsBackgroundLocationUpdates = true
    } else {
       print("Location not updated")
    }
    
  5. 最后添加 CLLocationManagerDelegate

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Location updated\(locations)")
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Location_update_error\(error)")
}

也许这会解决您的问题。

对于 WatchOS 6+,您的手表应用可以请求 WKExtendedRuntimeSession (see documentation) 如果它属于以下 5 个用例之一:

  • 自我照顾
  • 正念
  • 物理治疗
  • 警报
  • 健康监测

解释 WKExtendedRuntimeSession 的相关 WWDC 视频:https://developer.apple.com/videos/play/wwdc2019/251/