swift 有办法让我的WatchKit应用在后台运行吗?

mrphzbgm  于 2023-05-05  发布在  Swift
关注(0)|答案(4)|浏览(176)

我是swift和WatchKit框架的新手。我从一个月开始学习这个。现在我的问题是:有可能在apple watch上以后台模式运行应用程序吗?我从文档中读到WatchKit扩展不支持后台执行模式。但如果这件事是真的,如何工作的应用程序,如健康应用程序?我的意思是,在手表上有一个名为健康的应用程序,即使应用程序不在前台,它也会在每个时刻记录您的心率。我或多或少会做同样的事情。在我的应用程序中,即使应用程序不在前台,我也只会在用户移动手表时检测用户加速度。我该怎么做?请给我张贴必要的文件这样做。非常感谢!
Ps.对不起我的英语!

n53p2ov0

n53p2ov01#

是的,你可以。有几种方法:
1.使用HKWorkoutSession开始锻炼-最强大的方式,但您需要使用HealthKit,Apple Watch上只有一个应用程序可以以这种方式运行。
1.使用WKAudioFilePlayer在后台播放音频-仅用于音频。

  1. WKURLSessionRefreshBackgroundTask适用于短背景刷新。
    1.还有其他后台任务,例如WKSnapshotRefreshBackgroundTaskWKURLSessionRefreshBackgroundTask。它们列在this article的后台任务部分。
  2. performExpiringActivity(withReason:using:)可用于在应用程序进入后台时短暂延长其寿命。
    另外,请阅读Leveraging iOS Technologies
crcmnpdw

crcmnpdw2#

使用WatchOS 6+,如果您的手表应用福尔斯以下5种用例之一,则可以请求WKExtendedRuntimeSession (see documentation)

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

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

mpgws1up

mpgws1up3#

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

mm9b1k5b

mm9b1k5b4#

我也面临着同样的问题。我想在应用程序处于后台模式时执行一些代码。我已经解决了这个问题。我发现了一个额外的状态,我的手表应用程序将继续在后台运行,这不需要HKWorkoutSession或上面讨论的任何其他解决方案。只要按照这些步骤
1.导入CoreLocation
1.在类中添加CLLocationManagerDelegate
1.在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")
}

1.在最后添加CLLocationManagerDelegate

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

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

也许这会解决你的问题。

相关问题