iOS 配置

iPhone 应用程序

  1. 导入 WatchConnectivity 并符合 WCSessionDelegate。
  2. 通过 WCSession.default() 使用静态会话委托。
  3. 使用以下方法将数据发送到 Watch app
 `WCSession.default()`.sendMessage(message, replyHandler:_ errorHandler:_)
  1. 消息对象应该是[String:Any]类型的字典
  2. 如果你正在寻找从 Watch 应用程序返回的数据,请在 replyHandler 中定义的闭包中提供逻辑; 否则,传递无。
  3. 要响应 Watch 应用程序发送的消息,你将使用 WCSessionDelegate 回调方法
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...}

你需要将 WatchConnectivity 框架导入 iOS 应用程序中的视图控制器文件中。这使你可以访问旨在与 Watch 配套应用程序通信的类对象。你还需要在 Watch 应用程序端导入它。与 Watch 应用程序唯一真正的区别是,你将没有视图控制器文件,而是一个接口控制器文件。

import WatchConnectivity

接下来,你需要确保你的应用程序可以支持 WatchConnectivity 的会话。如果可以,则必须将视图控制器设置为其委托并激活默认会话。你会在这里得到一个错误。在 IDE 开始冷静之前,你需要符合 WCSessionDelegate 并实现一些方法。

// MARK: - View Life Cycle Callbacks
override func viewDidLoad() {
    super.viewDidLoad()

    automaticallyAdjustsScrollViewInsets = false
    if WCSession.isSupported() {
        WCSession.default().delegate = self
        WCSession.default().activate()
    }
    else {
        print("
ViewController: connectionManager is nil
")
    }
}

为了符合 WCSessionDelegate,让我们在视图控制器的底部添加一个扩展。有些人讨厌这种方法。我有自己的方式,但出于教学目的,我将遵循 RayWenderlich 方法。我非常喜欢直接从 COMMAND + CLICKING 代表中获取代码并从规范中获取所有方法并开始操作它并理解其工作原理。在这个扩展中,我将为你提供所有方法。它们已经标记好,以便你在控制台中看到它们的每个时间。如果你觉得活泼,删除一些标记为 OPTIONAL 的,以使你的代码文件看起来很漂亮。

extension ViewController : WCSessionDelegate {

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        print("0. ViewController: ", "activationDidCompleteWith activationState")
    }

    /** ------------------------- iOS App State For Watch ------------------------ */

    func sessionDidBecomeInactive(_ session: WCSession) {
        print("1. ViewController: ", "sessionDidBecomeInactive")
    }

    func sessionDidDeactivate(_ session: WCSession) {
        print("2. ViewController: ", "sessionDidDeactivate")
    }

    func sessionWatchStateDidChange(_ session: WCSession) {
        print("3. ViewController: ", "sessionDidDeactivate")
    }

    /** ------------------------- Interactive Messaging ------------------------- */

    func sessionReachabilityDidChange(_ session: WCSession) {
        print("4. ViewController: ", "sessionReachabilityDidChange")
    }

    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        print("5. ViewController: ", "didReceiveMessage")
    }

    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) {
        print("6. ViewController: ", "didReceiveMessage")
        // This is where you handle any requests coming from your Watch App
    }

    func session(_ session: WCSession, didReceiveMessageData messageData: Data) {
        print("7. ViewController: ", "didReceiveMessageData")
    }

    func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Swift.Void) {
        print("8. ViewController: ", "didReceiveMessageData")
    }

    /** -------------------------- Background Transfers ------------------------- */

    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
        print("9. ViewController: ", "didReceiveApplicationContext")
    }

    func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) {
        print("10. ViewController: ", "didFinish userInfoTransfer")
    }

    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
        print("11. ViewController: ", "didReceiveUserInfo")
    }

    func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) {
        print("12. ViewController: ", "didFinish fileTransfer")
    }

    func session(_ session: WCSession, didReceive file: WCSessionFile) {
        print("13. ViewController: ", "didReceive file")
    }
}

要将数据发送到你的 Watch App,一旦 Watch App 请求它,你将在方法中处理此问题…

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) {
    print("6. ViewController: ", "didReceiveMessage")
    // build out your response message using a Dictionary
    let returnMessage: [String : Any] = [
       "key1" : value1,
       "key2" : value2,
       "key3" : value3
    ]
    // return your data in this manner
    replyHandler(returnMessage)
    // WARNING
    // You must call the replyHandler before the method ends, otherwise, your app will crash.
}

这只是交易的一半! 你必须将 Watch 应用程序配置为连接到 iPhone 应用程序并处理任何返回的消息!