Apple Watch 和 iPhone 通信實踐
本文主要從實踐的角度分析 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 通信的橋梁,下圖展示了三者間的通信過程:
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 會實現這樣的效果。
Extension 和 iPhone App 另外一種通信方式是 Extension 主動向 iPhone App 發起請求,進行某種操作,或者請求數據(場景:Watch 收到新郵件通知后,點擊已讀按鈕,在 iPhone App 上置已讀)。
Extension 發起請求:
- + (BOOL)openParentApplication:(NSDictionary *)userInfo
- reply:(void (^)(NSDictionary *replyInfo,
- NSError *error))reply
iPhone App 回應請求:
- - (void)application:(UIApplication *)application
- handleWatchKitExtensionRequest:(NSDictionary *)userInfo
- reply:(void (^)(NSDictionary *replyInfo))reply
Demo
MMWormhole通 過共享存儲空間和通知機制實現 Extension 和 iPhone App 的通信。利用了 CFNotificationCenter 中的 Darwin notification center 來實現進程間通信,即通知機制的實現。大家如果有興趣可以看看代碼。
來自:http://nilsun.github.io/iPhone-watch-communication/