Apple Watch 和 iPhone 通信實踐

jopen 9年前發布 | 40K 次閱讀 Android開發 移動開發 Apple Watch

本文主要從實踐的角度分析 iPhone 和 Watch 的通信框架, 關于 Watch 開發的基本概念可以參考之前寫的一篇文章《Apple Watch開發初探》

WatchKit Extension,iPhone App,Watch App關系

給 iPhone App 添加 Watch App 支持需要在 iPhone 工程中添加 Watch Extension,添加后工程中對應生成兩個新的target:WatchKit Extension 和 WatchKit App,分別對應邏輯和界面。開發完成后,WatchKit Extension 和 iPhone App 被一起安裝到 iPhone 中,如果 iPhone 有匹配的 Watch,系統會提示是否需要將 WatchKit App 安裝到 Watch 上。

WatchKit Extension

WatchKit Extension 是 iPhone App 和 Watch App 通信的橋梁,下圖展示了三者間的通信過程:

Apple Watch 和 iPhone 通信實踐

1、Extension 和 Watch App ( Host App )的通信

在 Extension 中可以獲取到 Watch App 界面元素的數據接口 WKInterfaceObject(非控件 View 本身,更接近于 Model),通過修改 WKInterfaceObject 的數據,來修改對應Watch App的界面。

另外通過Xcode將Watch App控件的響應事件綁定到Extension中,可以實現Watch操作響應邏輯的處理。

Extension和Watch App的通信在開發實現層面上看起來相對比較簡單,開發者只需在接口上實現相關邏輯就可以了,而具體的通信過程,蘋果進行了封裝,對開發者是不可見的。

2、Extension 和 iPhone App ( Containing App )的通信

Extension 和 iPhone App 之間的一種通信方式是讀寫同一塊共享存儲空間,達到數據交換的目的目的(見下圖)。需要注意的是 Extension 和 iPhone App 屬于不同的進程,要共享存儲空間,需要在工程對應的 target 中同時打開 App Groups 的權限,并選擇共享的組名(打開權限需要在 Xcode 中配置開發者賬號和密碼,同時本地需要有對應的開發證書)。

但是修改存儲文件,并沒有達到直接通信的目的。存在這樣的問題:iPhone App 對文件進行了修改,Extension 并不知道文件發生了修改,很顯然,我們需要通過通知機制告訴 Extension 文件發生了修改,你可以更新新的數據了,本文最后的 Demo 會實現這樣的效果。

Apple Watch 和 iPhone 通信實踐

Extension 和 iPhone App 另外一種通信方式是 Extension 主動向 iPhone App 發起請求,進行某種操作,或者請求數據(場景:Watch 收到新郵件通知后,點擊已讀按鈕,在 iPhone App 上置已讀)。

Extension 發起請求:

   
  1. + (BOOL)openParentApplication:(NSDictionary *)userInfo
  2. reply:(void (^)(NSDictionary *replyInfo,
  3. NSError *error))reply

iPhone App 回應請求:

   
  1. - (void)application:(UIApplication *)application
  2. handleWatchKitExtensionRequest:(NSDictionary *)userInfo
  3. reply:(void (^)(NSDictionary *replyInfo))reply

Demo

MMWormhole通 過共享存儲空間和通知機制實現 Extension 和 iPhone App 的通信。利用了 CFNotificationCenter 中的 Darwin notification center 來實現進程間通信,即通知機制的實現。大家如果有興趣可以看看代碼。

來自:http://nilsun.github.io/iPhone-watch-communication/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!