我可以在后台保留 Watch 应用程序 运行 吗?

Can I keep a Watch app running in background?

我知道 iOS 允许后台任务 运行,例如,继续接收位置更新,但是可以在手表应用程序中执行此操作吗? 在 Xcode 9.3 中,我为 "background modes" 配置了我的应用程序并选择了位置,并为 WatchKitExtension 创建了一个 Info.plist,一个 "Required background modes" 的 "App registers for location updates" 条目].

但我的手表应用程序在屏幕关闭时和在 Dock 中时仍然挂起。

App Programming Guide for watchOS,但是似乎排除了 运行在后台接收位置更新的可能性,因为它只允许后台处理四个 类 of activity:

  1. 后台应用刷新任务。使用 WKApplicationRefreshBackgroundTask 对象来...
  2. 后台快照刷新任务。使用 WKSnapshotRefreshBackgroundTask 对象更新 ...
  3. 后台监视连接任务。使用 WKWatchConnectivityRefreshBackgroundTask 对象接收您的 iOS 应用发送的数据 ...
  4. 后台 NSURLSession 任务。 ...

SO 的其他帖子表明这是不可能的,但证明否定是困难的,所以我再问一次:

我是 "flogging a dead horse" 试图让手表应用程序在后台运行以接收位置更新,还是 Xcode 承诺 WatchOS 不会交付。

不,不可能。

正如 WatchKit Programming Guide 明确指出的那样,WatchKit 应用不能使用后台执行,但 3 个用例除外:

  • 网络操作使用 URLSession
  • 正在使用 WKAudioFilePlayerWKAudioFileQueuePlayer
  • 播放音频
  • 运行 使用 HKWorkoutSession
  • 的锻炼

根据 WatchKit 编程指南,您无法在后台接收位置更新,这应该在连接到您的 watchOS 应用程序的 iOS 应用程序中完成。

我很高兴能够报告说,过去两周我一直在鞭打的那匹马毕竟没有死!

我发现了一种额外的状态,在这种状态下,我的手表应用程序将在不需要 HKWorkoutSession 的后台继续 运行。

这些设置起到了作用:

locationManager.allowsBackgroundLocationUpdates = true

并在 watchKitExtension info.plist:

将 UIBackgroundModes(必需的背景模式)设置为位置(应用注册位置更新)

我再说一遍:我没有使用 healthKit

现在我的应用程序会继续 运行 即使屏幕关闭并且应用程序不在 Dock 中。