为什么我的 Apple Watch OS 应用只能在我的 iOS 应用处于活动状态时才能收到来自我的 iOS 应用的消息?

Why can my Apple Watch OS app receive message from my iOS app only when it is active?

我正在尝试构建一个与 Apple Watch 应用程序通信的慢跑应用程序。当我按下“开始”按钮时,iOS 应用程序应向我的 Watch 应用程序发出信号以开始跟踪我的锻炼。 (例如显示经过的时间、测量心率等)为了实现这一点,iOS 和 WatchOS 应用程序应该进行通信。我的应用程序的问题是我的 WatchOS 应用程序只能在我的 iOS 应用程序打开时接收信号。 (例如手表屏幕打开)

这是来自我的 iOS 应用程序的代码:

@objc func startAction() {
                 
    if WCSession.isSupported() {
        print("WC session is supported...")
        let session = WCSession.default
        session.delegate = self
        session.activate()

        session.sendMessage(["testWorkout":true], replyHandler: nil) { error in
            print("ERROR: \(error.localizedDescription)")
        }
    }    
}

这是另一端的代码(来自手表端):

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
            
    WKInterfaceDevice.current().play(.start)
    
    print("message test workout")

}

当 Apple Watch 打开时,我听到播放声音和打印输出消息:“消息测试锻炼”,但是 当 Apple Watch 的屏幕关闭时,WatchOS 应用程序收不到信号。我可以从 iOS 应用程序端编写什么代码(或者我可以从 WatchOS 应用程序端执行的任何其他操作)来唤醒 WatchOS 应用程序?

您不应在 activate 之后立即调用 sendMessage - 会话可能不会(并且可能不会)处于活动状态。

您需要等到收到 activationDidCompleteWith 委托回调后才能尝试通信。

在尝试发送数据之前,您应该检查会话状态是否为 .active,如果会话不再处于活动状态,则重新激活该会话。