当watchOS应用程序使用HKWorkoutSession在后台运行时如何使WCSession可访问

Posted

技术标签:

【中文标题】当watchOS应用程序使用HKWorkoutSession在后台运行时如何使WCSession可访问【英文标题】:How to make WCSession reachable when the watchOS app is running in background with HKWorkoutSession 【发布时间】:2021-03-12 14:38:43 【问题描述】:

我的 watchOS 应用使用锻炼 API 以便在应用进入后台时保持运行。问题是当应用程序处于后台时,WCSession 变得无法访问。但是,我能够运行我的代码,并且在某些情况下,它需要向 iPhone 对应应用程序发送消息。

应用程序的细节要求用户不必与其交互 - 如果超时,手表应用程序应自动将消息发送到手机。

这有可能实现吗?谢谢。

【问题讨论】:

【参考方案1】:

我相信handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) 方法是您正在寻找的。 Documentation Link

没有看到您的代码,我无法确定您当前的进度是什么,但我已使用此方法在用户位置更改时在后台更新 watchOS 并发症。

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) 
    for task in backgroundTasks 
        if WKExtension.shared().applicationState == .background 
            // Do your background work here.
            if let watchComplication = task as? WKWatchConnectivityRefreshBackgroundTask 
                pendingConnectivityTasks.append(watchComplication)
            
        
        task.setTaskCompletedWithSnapshot(true)
    
    completePendingConnectivityTasksIfNeeded()

附带说明一下,如果您的应用不是真正的锻炼应用,它会在应用审核期间因使用 HealthKit 锻炼会话而被拒绝。

【讨论】:

这些消息需要在后台非常频繁地发送。您是否建议我每次发送此类消息之前都需要启动一个后台任务? 后台执行时间是可控的,可以被 watchOS 限制或终止。如果您有很多数据要发送,我会尝试将数据批处理为某种数组或集合类型。然后在后台会话期间发送这些集合。此页面的中途是讨论此背景预算的地方。 developer.apple.com/documentation/watchkit/background_execution/… 那么它就不会削减它。我需要该应用程序能够在后台无限期运行时随时与手机对应方通信。

以上是关于当watchOS应用程序使用HKWorkoutSession在后台运行时如何使WCSession可访问的主要内容,如果未能解决你的问题,请参考以下文章

在独立的 watchOS 应用上实现核心数据

使用 WatchOS 应用程序时未调用 viewDidLoad

打开 WatchOS2 时获取更新的应用程序上下文

WatchOS 6.0、Swift 5.0:无背景触觉

watchOS 应用程序在显示睡眠后重置为根视图控制器

watchOS 上的后台 URLSession - 周期是啥?