WatchOS App架構(gòu)與更新 (WatchOS 2)
前言
WatchOS2出現(xiàn)后常侣,改變了很多東西:
- 其中最大的改變也是最充滿想象力的改變是將WatchKit Extension直接從iPhone移植到了AppleWatch上,所以這就給了AppleWatch原生App開發(fā)的基礎(chǔ)。
- 同時(shí)iOS APP與Watch App溝通也有一個(gè)Aplle推出的WatchConnectivityframework久妆,其中提供了一個(gè)類WCSession作為兩者溝通橋梁怠蹂,既可以傳輸String,Dictionary,Array等醒串,還可以共享文件。
- 而且WatchOS2提供了NSUrlSession拉取網(wǎng)絡(luò)數(shù)據(jù)鄙皇,這表示W(wǎng)atchAPP可以獨(dú)立訪問網(wǎng)絡(luò)芜赌,加之其可以連接WIFI的硬件,其實(shí)Watch對iPhone的依賴性減弱了很多
- WatchOS2中不能使用iCloud伴逸,只能發(fā)還數(shù)據(jù)給iPhone缠沈,iOS再使用iCloud
WatchOS 2的架構(gòu)
從上面的圖中,可以很明顯地看出错蝴,蘋果把原來運(yùn)行在 iPhone 手機(jī)上的 WatchKit Extension 移到 Apple Watch 中了洲愤。這將直接帶來如下改變:原來只存放一些資源和 Storyboard 的 Watch App,現(xiàn)在程序的業(yè)務(wù)邏輯部分(也就是代碼執(zhí)行部分)也被放到 Watch App 中顷锰。這樣的話柬赐,程序給用戶的體驗(yàn)會更好,Watch App 的運(yùn)行可以完全獨(dú)立于 iPhone 了官紫。值得注意的是肛宋,Apple Watch 2 中還支持 WiFi州藕,所以 Apple Watch 可以通過 WiFi,直接獲取一些網(wǎng)絡(luò)數(shù)據(jù)等酝陈。并且 Apple Watch 無法處理的一些業(yè)務(wù)床玻,可以通過 Connectivity 框架,請求 iPhone 進(jìn)行處理沉帮,并將結(jié)果返回給 Apple Watch锈死。
WatchOS 2的生命周期
用戶對AppleWatch的操作控制了你的App的啟動(dòng)和生命周期。用戶可以通過Home界面穆壕,Glance界面和表盤的Complication與通知Notification啟動(dòng)你的APP馅精。每一個(gè)這樣的操作都會啟動(dòng)你的WatchApp 和WatchAKit Extension。自此開始WatchAPP和WatchKit Extension開始傳遞信息和工作粱檀,直到用戶停止與你WatchAPP的交互洲敢,這時(shí)候iOS會掛起WatchKit Extension。
下圖是WatchApp Launching的過程
以及一個(gè)InterfaceController的生命周期
在ExtensionDelegate中會有WatchAPP的狀態(tài)監(jiān)聽
WatchAPP的狀態(tài)變化如下圖
Watch Connectivity
你可以通過WatchConnectivityframework
來實(shí)現(xiàn)watch與配對iPhone上的文件和數(shù)據(jù)的來回傳輸茄蚯。如果這兩個(gè)apps是在前臺上運(yùn)行压彭,則通信是實(shí)時(shí)的,否則通信會被轉(zhuǎn)移到后臺渗常,直至接收數(shù)據(jù)的一方啟動(dòng)進(jìn)入前臺的時(shí)候才轉(zhuǎn)移回來壮不。
在這個(gè)新框架的主要成員是WCSession
,它負(fù)責(zé)處理了兩個(gè)設(shè)備之間的所有通信皱碘。你不需要自己去創(chuàng)建這個(gè)類的實(shí)例對象询一,只需要使用defaultSession
單例對象就可以了。
要啟動(dòng)和運(yùn)行WCSession癌椿,你需要指定一個(gè)對象去遵從WCSessionDelegate
健蕊,分配給WCSession的委托屬性并調(diào)用activateSession()
。如果你打算頻繁的使用WatchConnectivity的話踢俄,我強(qiáng)烈建議你盡可能在apps的早期生命周期完成這個(gè)設(shè)置缩功。
這里貼出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
動(dòng)畫(Animation)
WatchKit還可以用之前那樣原始方式通過輪詢處理好的圖片組去運(yùn)行動(dòng)畫,不過WKInterfaceController現(xiàn)在通過animateWithDuration(_:animations:)提供了更接近于iOS的基礎(chǔ)動(dòng)畫都办。只需要持續(xù)時(shí)間和block嫡锌,就可以在設(shè)定的持續(xù)時(shí)間里執(zhí)行block里面的動(dòng)畫。例如:
animateWithDuration(1){()->Voidin
self.label.setHorizontalAlignment(.Left)
self.label.setAlpha(0)
}
你可以通過更改以下WKInterfaceObject屬性來設(shè)置動(dòng)畫:
- 透明度
- 寬高
- 垂直和水平位置
- 背景顏色
- 布局組中的插入
訪問更多硬件(MoreAccessToTheHardWare)
watchOS2提供了很多硬件設(shè)備和傳感器琳钉,包括電子表冠DigitalCrown势木,振動(dòng)引擎TapticEngine,心率傳感器heartratesensor歌懒,加速計(jì)accelerometer以及麥克風(fēng)microphone等啦桌。
新接口對象(NewInterfaceObjects)
蘋果在這個(gè)版本的WatchKit里推出了一個(gè)全新的接口對象:WKInterfacePicker,它是個(gè)通過電子表冠來進(jìn)行交互的滾動(dòng)列表歼培。在WKInterfacePicker中的物品(item)可以是文本震蒋、圖像茸塞、或是圖文混合。當(dāng)用戶選擇了里面的物品查剖,WatchKit調(diào)用WKInterfacePicker中的方法來傳遞選擇了的索引钾虐。
WKInterfacePicker可以通過三種不同風(fēng)格來展示:
- List:把物品垂直排列顯示的列表。
- Stacked:將要展示的物品轉(zhuǎn)為一疊卡片通過滾動(dòng)電子表冠來一張張顯示笋庄。
- ImageSequence:從圖像序列中抽出單個(gè)圖像展示效扫。
說到接口控制器,WKInterfaceController現(xiàn)在提供了讓你直接彈出alerts和actionsheets的方法直砂。
調(diào)用presentAlertControllerWithTitle(_:message:preferredStyle:actions:)在當(dāng)前的接口控制器彈出一個(gè)alert或是actionsheet菌仁。根據(jù)你設(shè)定的preferredStyle參數(shù)來顯示出不同的樣式。其中的actions參數(shù)是包含WKAlertAction實(shí)例的數(shù)組静暂,通過用戶點(diǎn)擊相應(yīng)的button來執(zhí)行它自身提供的block济丘。
自定義Widgets
自定義數(shù)字附件是圍繞家族概念構(gòu)建的,每個(gè)家族提供一個(gè)或多個(gè)模板洽蛀,你可以把你的數(shù)字附件子類化后摹迷,再通過這些模板實(shí)現(xiàn)。
有五種直接實(shí)現(xiàn)的數(shù)字附件:
- Modular:這家族有small,large兩個(gè)分類郊供,并且他們都能通過模塊watch界面上看到峡碉。
- Circular:只有small分類,在簡約watch界面上看到驮审。
-
Utilitarian:和Modular一樣有small,large兩款在實(shí)用watch界面上看到.
如果你沒有AppleWatch或是對watch界面類型不熟悉可以看指南了解鲫寄,里面也提到過怎么實(shí)現(xiàn)Custom Complications(自定義數(shù)字附件)。也可以從watchOS 2 Transition Guide的Providing Custom Complications部分查看更多關(guān)于編譯Custom Complications的細(xì)節(jié)疯淫。