首页 > 解决方案 > 从ios发送消息到watchos的问题

问题描述

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

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
        }               
    }

标签: iosswiftwatchos

解决方案


这是预期的行为

WatchKit 扩展。iOS 设备在范围内,因此可以进行通信并且 WatchKit 扩展程序在前台运行,或者在后台以高优先级运行(例如,在锻炼期间或当一个复杂功能正在加载其初始时间线数据时) .

您在需要实时消息传递时使用isReachable和。sendMessage为活动的配套 iOS 应用程序提供“远程控制”的手表应用程序或与手表上的活动锻炼应用程序通信的 iOS 应用程序就是示例。

为了让实时消息传递工作,手表确实需要保持清醒。

当手表未激活时,您可以使用updateApplicationContext和方法将数据传输到您的配套应用程序。transferUserInfo为了延长电池寿命,这些传输被排队和机会性地传输。


推荐阅读