2

我在尝试同步 iPhone 应用程序和 WatchKit 应用程序时遇到了问题。问题是 - 我的 WatchKit 应用程序tableView附加了来自 iPhone 的数据数组。

我正在使用来自 Watch Connectivity 框架的交互式消息传递

建立会话

    if(WCSession.isSupported()){
        self.session = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
    }

向 WatchKit 应用发送消息

    do {
        let dataDict = ["data": dictionary1]
        try WCSession.defaultSession().updateApplicationContext(dataDict)
    }

    catch {
        print(error)
    }

这就是我在手表上接收消息的方式

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {

    dispatch_async(dispatch_get_main_queue()) { () -> Void in


        if let retrievedArray1 = applicationContext["data"] as? [Int : Bool] {

            self.arrayOnWatch = retrievedArray1

        }
    }}

它在一个例外情况下运行良好 - 我无法获取数据数组,直到我在 iPhone 上启动应用程序,这在我的情况下不是解决方案。

关于如何在不打开实际手机应用程序的情况下传输和接收消息的任何想法?

谢谢你。

4

1 回答 1

2

使用应用程序上下文不适用于您的情况,因为它需要 iPhone 应用程序主动设置应用程序上下文。

您可以使用 WatchKitsendMessage让手表向 iPhone 应用程序请求数据。

在您的ExtensionDelegate中激活连接后向 iPhone 应用程序发送一条消息:

if WCSession.defaultSession().reachable {
    let messageDict = ["message": "hello iPhone!"]
    WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
        print(replyDict)
        }, errorHandler: { (error) -> Void in
        print(error)
    }
}

如果 iPhone 应用程序未运行,这将在后台唤醒您的 iPhone 应用程序。

在您的 iPhone 应用程序的AppDelegate中实现相应的 WCSessionDelegate 方法(在didFinishLauncingWithOptions:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    replyHandler(["message": "Hello Watch!"])
}

只需发送您的数据,而不是“Hello Watch!” 即使 iPhone 应用程序没有运行,您的手表也会有数据。

于 2015-10-23T16:09:12.433 回答