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

Posted

技术标签:

【中文标题】为啥我的 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 OS 应用只有在 iOS 应用处于活动状态时才能收到来自我的 iOS 应用的消息? 【发布时间】:2021-01-28 21:40:23 【问题描述】:

我正在尝试构建一个与 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 应用程序?

【问题讨论】:

【参考方案1】:

您不应该在activate 之后直接调用sendMessage - 会话可能不会(也可能不会)处于活动状态。

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

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

【讨论】:

以上是关于为啥我的 Apple Watch OS 应用只有在 iOS 应用处于活动状态时才能收到来自我的 iOS 应用的消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Apple Watch 检索 os_log 条目?

为啥我的 iPhone 无法从 Apple Watch 获取心率数据,但手表扩展程序却可以?

为啥我的 iPhone 无法从 Apple Watch 获取心率数据,但手表扩展程序却可以?

为啥通过 Apple Watch 向 iPhone 发送消息时 print() 不起作用?

对于 Swift 中的 Apple Watch OS,如何在 WCSession 激活完成后运行函数?

如何使用 Apple Watch 的 os_log 访问过去一天的日志?