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

问题描述 投票:0回答:4

我是 swift 和 WatchKit 框架的新手。我只研究了一个月。现在我的问题是:是否可以在 Apple Watch 上以后台模式运行应用程序?我从 WatchKit 扩展的文档中读到不支持后台执行模式。但如果这件事是真的,如何运行像健康应用程序这样的应用程序?我的意思是,在手表上有一个名为健康的应用程序,即使该应用程序不在前台,它也会在每个瞬间获取您的心率.我或多或少会做同样的事情。在我的应用程序中,即使应用程序不在前台,我也会仅在用户移动手表时检测用户加速度。我该怎么做?请将必要的文件寄给我。非常感谢!

附言。对不起我的英语不好!

ios swift watchkit core-motion
4个回答
7
投票

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

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

另外,阅读利用 iOS 技术


3
投票

使用 WatchOS 6+,您的手表应用可以请求

WKExtendedRuntimeSession
(参见文档) 如果它属于以下 5 个用例之一:

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

相关WWDC视频讲解

WKExtendedRuntimeSession
https://developer.apple.com/videos/play/wwdc2019/251/


1
投票

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


1
投票

我也面临同样的问题。我想在应用程序处于后台模式时执行一些代码。我已经解决了这个问题。我发现了一种额外的状态,在这种状态下,我的手表应用程序将继续在后台运行,不需要

HKWorkoutSession
或上面讨论的任何其他解决方案。只需按照以下步骤

  1. 进口
    CoreLocation
  2. 在课堂上添加
    CLLocationManagerDelegate
  3. 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")
    }
    
  4. 最后只需添加 CLLocationManagerDelegate

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

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

也许这会解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.