iOS 配置

iPhone 應用程式

  1. 匯入 WatchConnectivity 並符合 WCSessionDelegate。
  2. 通過 WCSession.default() 使用靜態會話委託。
  3. 使用以下方法將資料傳送到 Watch app
>  `WCSession.default()`.sendMessage(message, replyHandler:_ errorHandler:_)
> ```
> 
> 4.  訊息物件應該是\[String:Any\]型別的字典
> 5.  如果你正在尋找從 Watch 應用程式返回的資料,請在 replyHandler 中定義的閉包中提供邏輯; 否則,傳遞無。
> 6.  要響應 Watch 應用程式傳送的訊息,你將使用 WCSessionDelegate 回撥方法
> 
> <!-- end list -->
> 
> ``` placeholder
> func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...}
> ```

你需要將 WatchConnectivity 框架匯入 iOS 應用程式中的**檢視控制器**檔案中。這使你可以訪問旨在與 Watch 配套應用程式通訊的類物件。你還需要在 Watch 應用程式端匯入它。與 Watch 應用程式唯一真正的區別是,你將沒有**檢視控制器**檔案,而是一個**介面控制器**檔案。

``` placeholder
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 應用程式並處理任何返回的訊息!