在启动 phone 应用程序之前,在 Watch 上从 iPhone 获取字典 - WC

Get a dictionary from iPhone on Watch prior to launching the phone app - WC

我在尝试同步 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 上启动应用程序,这对我来说不是解决方案。

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

谢谢。

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

您可以使用 WatchKit 的 sendMessage 让手表向 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 应用不是 运行,您的手表也会有数据。