Watch應用的數(shù)據(jù)傳輸-與iPhone以及網(wǎng)絡(luò)(WatchOS 1)
iPhone App、WatchKit Extension和Watch App之間的關(guān)系
自iOS8起Apple推出一個新的概念-App Extension,可以讓開發(fā)者開發(fā)第三方的鍵盤悟泵、通知中心(Today Widget)等弦赖。
WatchKit Extension是iPhone App和Watch App通信的橋梁,下圖展示了三者間的關(guān)系:
WatchKit Extension(Extension)和Watch App(Host App)間的通信
在Extension中可以獲取到Watch App界面元素的數(shù)據(jù)接口WKInterfaceObject
(非控件View本身将谊,更接近于Model),通過修改WKInterfaceObject的數(shù)據(jù),來修改對應Watch App的界面旗笔。另外通過Xcode將Watch App控件的響應事件綁定到Extension中,可以實現(xiàn)Watch操作響應邏輯的處理拄踪。-
WatchKit Extension(Extension)和iPhone App(Containing App)的通信
-
共享存儲空間
Extension和iPhone App之間的一種通信方式是讀寫同一塊共享存儲空間蝇恶,達到數(shù)據(jù)交換的目的(見下圖)。需要注意的是Extension和iPhone App屬于不同的進程惶桐,要共享存儲空間撮弧,需要在工程對應的target中同時打開App Groups的權(quán)限,并選擇共享的組名(打開權(quán)限需要在Xcode中配置開發(fā)者賬號和密碼姚糊,同時本地需要有對應的開發(fā)證書贿衍,本文后面有介紹)。![]
(http://git.devzeng.com/images/apple_watch_dev_glance/share_container.png) -
直接進行通信(在WatchOS2中更加推薦)
Extension和iPhone App另外一種通信方式是Extension主動向iPhone App發(fā)起請求救恨,進行某種操作贸辈,或者請求數(shù)據(jù)(場景:Watch 收到新郵件通知后,點擊已讀按鈕肠槽,在iPhone App上置已讀)擎淤。
WatchKit Extension中向iPhone App發(fā)送請求:
+ (BOOL)openParentApplication:(NSDictionary * nonnull)userInfo reply:(void (^ nullable)(NSDictionary * nonnull replyInfo, NSError * nullable error))reply;
在iPhone App的AppDelegate中實現(xiàn)如下方法響應Watch App的請求:
- (void)application:(UIApplication * nonnull)application handleWatchKitExtensionRequest:(NSDictionary * nullable)userInfo reply:(void (^ nonnull)(NSDictionary * nullable replyInfo))reply;
在Github上找到一個叫做
MMWormhole
的開源庫,它是專門用于Container App與Extension間傳遞消息署浩,整個項目非常簡潔實用揉燃。在WatchOS2中,APPLE公司特地做了一個類似于MMWormhole的framework叫做
WatchConnectivity
其中有一個最為關(guān)鍵的類叫做WCSession:NSObject這里貼出WCSession的一些代碼和解釋:(只支持iOS9及更新版本,在ContainerApp和Extension中使用一致)
@interface WCSession : NSObject
硬件是否支持:
+ (BOOL)isSupported;
單例對象:
+ (WCSession *)defaultSession;
擁有的Delegate:
@property (nonatomic, weak, nullable) id <WCSessionDelegate> delegate;
(在這里需要)delegate中使用較多的有:(接收信息后的一些處理)
- (void)session:(WCSession * ) session didReceiveMessage:(NSDictionary<NSString * , id> *)message;
- (void)session:(WCSession * )session didReceiveMessage:(NSDictionary<NSString * , id> * )message replyHandler:(void(^)(NSDictionary<NSString * , id> *replyMessage))replyHandler;
激活對象:
- (void)activateSession;
(在APP生命周期中激活越早越好)發(fā)送信息:
- (void)sendMessage:(NSDictionary<NSString *, id> *)message replyHandler:(nullable void (^)(NSDictionary<NSString *, id> *replyMessage))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;
- (void)sendMessageData:(NSData *)data replyHandler:(nullable void (^)(NSData *replyMessageData))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;
一般的使用過程:
if ([WCSession isSupported]) { WCSession *session = [WCSession defaultSession]; session.delegate = self; [session activateSession]; } //接下來開始send或者receive
-
Watch App的啟動過程和生命周期
當用戶在Apple Watch上運行應用時筋栋,用戶的iPhone會自行啟動相應的WatchKit應用擴展炊汤。通過一系列的信號交換,Watch App和WatchKit Extension互相連接弊攘,因此消息能夠在二者之間流通抢腐,直到用戶停止與應用進行交互為止。此時襟交,iOS將暫停應用擴展的運行迈倍。
在啟動的過程中,WatchKit自動為當前界面創(chuàng)建相應的界面控制器捣域。如果用戶正在查看glance啼染,WatchKit創(chuàng)建出來的界面控制器將與glance相連接宴合。如果用戶直接啟動應用,WatchKit將從應用的主故事板文件中加載初始界面控制器迹鹅。無論哪種情況卦洽,WatchKit應用擴展都提供一個名為WKInterfaceController的子類來管理相應的界面。
-
啟動Watch App的過程
當用戶在Apple Watch上與應用進行交互時斜棚,WatchKit應用擴展將保持運行阀蒂。如果用戶明確退出應用或者停止與Apple Watch進行交互,那么iOS將停用當前界面控制器弟蚀,并暫停應用擴展的運行蚤霞。與Apple Watch的互動是非常短暫的,因此這幾個步驟都有可能在數(shù)秒之間發(fā)生义钉。所以昧绣,界面控制器應當盡可能簡單,并且不要運行長時任務捶闸。重點應當放在讀取和顯示用戶想要的信息上來滞乙。
-
界面控制器的生命周期
當應用啟動時,WatchKit框架自行創(chuàng)建了相應的WKInterfaceController
對象并調(diào)用initWithContext:
方法鉴嗤。使用該方法來初始化界面控制器捕犬,然后加載所需的數(shù)據(jù)艰山,最后設(shè)置所有界面對象的值。
在應用生命周期的不同階段啊鸭,iOS將會調(diào)用WKInterfaceController對象的相關(guān)方法來讓您做出相應的操作发绢。WKInterfaceController的幾個主要的方法說明如下:- initWithContext:這個方法用來準備顯示界面硬耍。借助它來加載數(shù)據(jù),以及更新標簽边酒、圖像和其他在Storyboard場景上的界面對象经柴。
- willActivate:這個方法可以讓您知道該界面是否對用戶可視。借助它來更新界面對象墩朦,以及完成相應的任務坯认,完成任務只能在界面可視時使用。
- didDeactivate:使用didDeactivate方法來執(zhí)行所有的清理任務氓涣。例如牛哺,使用此方法來廢止計時器、停止動畫或者停止視頻流內(nèi)容的傳輸劳吠。您不能在這個方法中設(shè)置界面控制器對象的值引润,在本方法被調(diào)用之后到willActivate方法再次被調(diào)用之前,任何更改界面對象的企圖都是被忽略的痒玩。
說明:glances不支持動作方法淳附。單擊應用glance始終會啟動應用议慰。