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

Posted

技术标签:

【中文标题】我可以让 Watch 应用程序在后台运行吗?【英文标题】:Can I keep a Watch app running in background? 【发布时间】:2017-12-19 23:06:08 【问题描述】:

我知道 ios 允许后台任务运行,例如,继续接收位置更新,但可以在手表应用中执行此操作吗? 在 Xcode 9.3 中,我为我的应用程序配置了“背景模式”和选定的位置,并为 WatchKitExtension 的 Info.plist 创建了一个“应用程序注册位置更新”的“必需背景模式”条目。

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

不过,App Programming Guide for watchOS 似乎排除了在后台运行以接收位置更新的可能性,因为它只允许对四类活动进行后台处理:

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

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

我试图让手表应用在后台运行以接收位置更新,是在“鞭笞死马”,还是 Xcode 承诺 WatchOS 不会提供。

【问题讨论】:

【参考方案1】:

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

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

这些设置成功了:

locationManager.allowsBackgroundLocationUpdates = true

在 watchKitExtension info.plist 中:

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

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

现在我的应用程序即使在屏幕关闭和应用程序离开 Dock 时也能继续运行。

【讨论】:

等一下:当应用程序不在前台时,您是否真的收到了后台信息?我一直在尝试这个,即使使用你提到的allowsBackgroundLocationUpdates,也无济于事。正如@Dávid Pásztor 在下面提到的那样,即使是 Apple 也表示这不应该。 是的,它会在完全处于后台时继续接收和处理位置更新,无论是在 Dock 之外还是在屏幕关闭的情况下。如此之多,以至于我不得不添加一个用户输入来关闭位置更新以完全杀死该应用程序!我仍然很紧张,因为我可能找到了一个后门,当我去发布时,苹果会猛烈抨击。自己试一试 我会努力的!事实上,我只需要将它与requestLocation() 调用一起使用。我需要它来获取我的位置,以便为我的应用程序获取正确的更新。试了几次,后台进程挂在那里。 我怀疑它不适用于 requestLocation,因为您的应用必须在前台才能发出命令。 有一颗金星代表毅力!那么,这一切都在谈论它是不可能的吗?您的应用是否已获准发布?【参考方案2】:

不,这是不可能的。

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

网络操作使用URLSession 使用WKAudioFilePlayerWKAudioFileQueuePlayer 播放音频 使用HKWorkoutSession 进行锻炼

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

【讨论】:

也许我问错了问题,但这显然是可能的。当屏幕关闭或在 Dock 中时,有些应用程序会继续获取位置更新。当手机留在家中时,Strava 和 Nike+RunClub 都会记录您的轨迹。我刚刚将它们安装在我的 AW2 上,并且可以肯定地确认这一点。 它们是锻炼应用程序,使用HKWorkoutSession 对象可以在后台运行。您可以在锻炼期间接收位置更新,但如果您的应用不是真正的锻炼应用,它可能会因为使用 HKWorkoutSession 只是为了获取位置更新而被 AppStore 拒绝。 原生应用除外。原生应用具有“特殊权限”,即使它们没有进行锻炼或播放音频,它们也可以留在前台。 你是说系统应用吗? watchOS 只有原生应用,不能使用 Cordova 等框架为 watchOS 编写非原生应用。如果您确实指的是系统应用程序,我看不出它的相关性,因为这个问题显然不是由为watchOS 制作系统应用程序的 Apple 开发人员提出的。 @AbhishekThapliyal 除非您实际上是在开发锻炼应用程序,否则不会。首先,如果您为非锻炼应用程序使用锻炼模式只是为了能够在后台运行它,您的应用程序将被拒绝。其次,使用锻炼会导致严重的电池消耗,尤其是在使用不正确的情况下。

以上是关于我可以让 Watch 应用程序在后台运行吗?的主要内容,如果未能解决你的问题,请参考以下文章

apple watch怎么关闭后台

如何每小时在后台运行约 30 秒的进程(iphone 应用程序)

有没有办法在 Apple Watch 的后台每天运行一次代码?

让应用程序始终在 Android 上后台运行

我需要让我的应用程序总是在后台运行。

尝试在屏幕关闭时让 Apple Watch 计时器应用程序在后台运行