从 ios 向 watchos 发送消息的问题

Posted

技术标签:

【中文标题】从 ios 向 watchos 发送消息的问题【英文标题】:Issue in sending message from ios to watchos 【发布时间】:2021-09-16 20:52:53 【问题描述】:

我正在尝试从我的 ios 应用向其配套的 Watch 应用发送消息。如果手表屏幕打开,那么一切正常,我可以看到消息。如果屏幕变黑,则表示手表“无法访问”并且我的消息不会被打印出来。

iOS 代码

// Invoking this function from viewDidLoad() of the view controller
func checkWatchConnectivityIsSupported() 
        if (WCSession.isSupported()) 
            print ("WC Session is supported")
            let session = WCSession.default
            session.delegate = self
            session.activate()
        
    

// sending messages on click of a button
func sendMessageToWatch(type: String, message: String) 
               
        print ("Sending message to watch \(type) \(message)")
        // send a message to the watch if it's reachable
        if (WCSession.default.isReachable) 
            print ("isReachable")
            // this is a meaningless message, but it's enough for our purposes
            let message = [type: message]
            // WCSession.default.sendMessage(message, replyHandler: nil)
            WCSession.default.sendMessage(message, replyHandler: nil, errorHandler:  (err) in
                print ("There was an error in sending message \(err)")
                            debugPrint(err)
                        )
           
         else 
// This happens when the watch screen display goes off.
            print ("watch is not reachable")
        
    

WatchOS 代码 - InterfaceController.swift

// invoking this function from willActivate()
func checkIfWatchIsConnected() 
        if WCSession.isSupported() 
            let session = WCSession.default
            session.delegate = self
            session.activate()
        
    

// implementation of delegate methods
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) 

    
    
    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) 
        print ("Message received in watch \(message)")
        WKInterfaceDevice().play(.click)
        let isStatusType = message["Status"] != nil
        if (isStatusType) 
            let text = message["Status"] as! String
            statusLabel.setText(text)
            return
                       
    

【问题讨论】:

【参考方案1】:

这是expected behaviour。

WatchKit 扩展。 iOS 设备在范围内,因此可以进行通信,并且 WatchKit 扩展正在前台运行,或者在后台以高优先级运行(例如,在锻炼会话或并发症正在加载其初始时间线数据时)。

当需要实时消息传递时,您使用 isReachablesendMessage。例如,为活动的配套 iOS 应用程序提供“远程控制”的手表应用程序或与手表上的活动锻炼应用程序通信的 iOS 应用程序。

为了让实时消息起作用,手表确实需要保持清醒。

您可以在手表未激活时使用updateApplicationContexttransferUserInfo 方法将数据传输到您的配套应用。为了延长电池寿命,这些传输会排队等待并随机传输。

【讨论】:

非常感谢!!你是救生员:)

以上是关于从 ios 向 watchos 发送消息的问题的主要内容,如果未能解决你的问题,请参考以下文章

直接向 watchOS 2 发送推送通知?

WCSession 无法发送消息

为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?

使用应用程序上下文将数据从 iPhone 发送到 WatchOS 时遇到问题

Parse.com - 从 Parse.com 向 iOS 应用程序发送消息,不像推送通知

如何在socket.io中向特定用户发送消息?