1

我正在尝试让 iOS 应用程序与手表进行通信,但我一直得到不一致的行为 - 要​​么通信太慢,要么根本没有数据传输。

此外,当 watchKit 运行时,我没有看到任何“电话已禁用”屏幕(这会导致崩溃,因为我需要先从电话中获取数据)。

这就是我在 iPhone 应用程序中建立 WCSession 时所拥有的

应用代理

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

       if NSClassFromString("WCSession") != nil {
            if #available(iOS 9.0, *) {
                if(WCSession.isSupported()){
                    self.session = WCSession.defaultSession()
                    self.session.delegate = self
                    self.session.activateSession()
                    if session.paired {
                        print("Watch connected")
                    } else {
                        print("No watch")
                    }
                }
            } else {
            }}

        if NSClassFromString("WCSession") != nil {
            if(WCSession.isSupported()){
                session.sendMessage(["b":"delegateSaysHi"], replyHandler: nil, errorHandler: nil)
            }}
}

主视图控制器 (viewDidLoad)

if NSClassFromString("WCSession") != nil {
        if(WCSession.isSupported()){
            self.session = WCSession.defaultSession()
            self.session.delegate = self
            self.session.activateSession()
            if session.paired {
                print("Watch connected")
            } else {
                print("No watch")
            }
    }}

MainViewController(将一堆数据从 iOS 应用程序传输到 watchKit 应用程序的方法)

    func transferData(){
    do {
        let dataArray = ["somedata": array2d1]
        try WCSession.defaultSession().updateApplicationContext(dataArray)
        let dataArray1 = ["somedata1": array2d2]
        try WCSession.defaultSession().updateApplicationContext(dataArray1)
        let dataArray2 = ["somedata2": array2d3]
        try WCSession.defaultSession().updateApplicationContext(dataArray2)
            let dataArray3 = ["somedata3": array2d4]
        try WCSession.defaultSession().updateApplicationContext(dataArray3)

// and up to 12
        }

    catch {
        print("Something wrong happened")
    }
    }

这适用于 watchKit 应用程序

应用代理

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

func applicationDidBecomeActive() {
    if(WCSession.isSupported()){
        self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil)
    }

接口控制器 (awakeWithContext)

if(WCSession.defaultSession().reachable){
    self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil)
}

接收ApplicationContext数据的方法

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

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

        if let retrievedArray1 = applicationContext["somedata"] as? [[String]] {
                self.watchAppArray = retrievedArray1

        }
        if let retrievedArray2 = applicationContext["somedata2"] as? [[String]] {

             self.watchAppArray = retrievedArray1

// and so on for 12 arrays sent from phone

        }

        }
    }}

非常欢迎任何有关清除情况的建议!

谢谢你。

4

1 回答 1

2

多个代表/激活:

您在应用程序的不同部分反复设置、委派和激活会话。您不断更改您的委托,因此在您将处理委托给应用程序的另一部分后,将不再使用应用程序一部分中的代码。

您应该在整个应用程序中使用单个会话/委托。一种解决方案是设置一个WCSession可在应用程序范围内使用的单例。这是一个指导您完成该过程的指南。

只会发送最新的应用程序上下文:

通过尝试将多个应用程序上下文请求排队,当系统开始传输它时,较早的请求将不再在队列中,因为系统已经用后面的上下文替换了前面的上下文。所以只有最后一个 ( dataArray3) 会被传输。

使用 updateApplicationContext:error: 方法将最近的状态信息传达给对方。当对方醒来时,它可以使用此信息来更新自己的状态。...此方法会覆盖以前的数据字典,因此当您的应用仅需要最新数据值时使用此方法。

如果所有数组都代表您的应用程序的最近状态,您希望将它们一起传输到一个字典中。

var dataArray = [String: AnyObject]()
dataArray["somedata"] = array2d1
dataArray["somedata1"] = array2d2
dataArray["somedata2"] = array2d3
dataArray["somedata3"] = array2d4

do {
    try session.updateApplicationContext(dataArray)
}
catch {
    print(error)
}

它也可能有助于为您的sendMessage代码添加一些错误处理,因为配对的设备可能并不总是可以访问。

通讯慢:

至于通讯太慢,有两个问题。

  • 转移可能不会立即发生。

    当只有一个会话处于活动状态时,活动会话可能仍会发送更新和传输文件,但这些传输是在后台随机发生的。

    请记住,后台传输不会立即交付。系统尽可能快地发送数据,但传输不是即时的,系统可能会稍微延迟传输以提高功耗。此外,发送大型数据文件需要相应的时间将数据传输到其他设备并在接收端进行处理。

  • 您发送的数据越多,传输/接收所有数据所需的时间就越长。

    发送消息时,仅发送您的应用需要的数据。所有传输都涉及将数据无线发送到对方应用程序,这会消耗电力。与其每次都发送所有数据,不如只发送已更改的项目。

您可以控制发送的数据量,以及数据是交互发送还是在后台发送。如果手表触手可及,则可以sendMessage用于即时通信。如果无法访问,您可以使用后台方法。

于 2016-03-17T19:52:52.450 回答