Apple Watch現在對于第三方開發者來說更多的還是一塊額外的螢幕。暫時WatchKit沒有能給出足夠的接口。現在Watch App的主要運算邏輯需要依賴iPhone,Apple也承諾會有原生的手表App,可能要等到Apple Watch和WatchKit的完全版面世的時候。
Apple Watch 開發詳解
1、兩種螢幕分辨率
螢幕尺寸 | 38mm | 42mm |
---|---|---|
分辨率 | 272 x 340 | 312 x 390 |
寬高比 | 4:5 |
2、三種螢幕模式
主屏模式 | Glance模式 | 通知模式 |
---|---|---|
主界面 | 單屏即時資訊頁面 | 消息通知界面 |
可自定義布局,放置button等控件 | 所有資訊必須在一屏内展示,不能有互動控件,點選進入Watch應用 | 有通知的時候喚起,可添加合适的按鈕 |
![]() | | |
3、兩種通知顯示方式
- 兩種顯示模式
Short Look | Long Look |
---|---|
檢視螢幕上包含應用圖示、名稱、簡單通知内容等資訊 | 應用圖示和名稱将會移至螢幕頂端,内容占據主要的顯示空間,佩戴者可以滑動來完成其它互動 |
| |
- 兩種載入模式
static | dynamic |
---|---|
直接載入 | 初始化interfaceController後載入 |
| |
4、手勢
隻支援以下手勢,不支援自定義手勢
手勢 | 行為 |
---|---|
縱向滑動 | 浏覽内容 |
橫向滑動 | 頁面間切換 |
點按 | 選擇内容 |
長按擠壓 | 打開菜單 |
數字表冠 | 旋轉,調整滾動速度 |
螢幕邊緣向左掃 | 傳回上一個界面 |
螢幕底部向上滑 | 打開Glance界面 |
5、 Watch App 架構
- 一個完成的Watch應用由 WatchKit App 和 WatchKit Extension兩部分組成,WatchKit App負責展示,安裝在Watch上,WatchKit Extension負責業務和控制邏輯,安裝在iPhone上。所有運算、邏輯以及控制都是在iPhone上完成。通過WatchKit通訊
Apple Watch 開發詳解 - Watch App 控制流
Apple Watch 開發詳解 - ViewController 生命周期
Apple Watch 開發詳解
6 、基礎類
- WKInterfaceController 相當于UIViewController 。生命周期方法分别是:
-initWithContext: 被初始化時調用,一般在這裡配置視圖元素,相當于-viewDidLoad
-willActivate 将要呈現的時候調用,也可以在這個方法中進行視圖元素的設定,相當于-viewWillAppear
-didDeactivate 呈現後調用,在這個方法中停用持有self的對象,如NSTimer。相當于-viewDidDisappear
- WKInterfaceObject 及其子類
WKInterfaceObject 相當于UIView的代理,WatchKit實際呈現的View對于開發者來說是不可見的,隻能通過WKInterfaceObject對UI對象屬性進行設定,可以設定的屬性非常少。學習成本并不大。
WKInterfaceButton 相當于UIButton的代理
WKInterfaceImage 相當于UIImageView的代理
WatchKit獨立于UIKit,所有的類都繼承自NSObject,沒有完整的Response chain
7、UI開發
- Watch App 的視圖開發不能使用代碼,必須StoryBoard。
- Watch App 采取的布局方式和 iOS App完全不同。不能使用 autoLayout或者坐标。隻能使用相對布局。
水準:left center right
垂直:top center bottom
- View Size可以使用三種方式設定:
Size To Fit Content : View的大小适應内容的大小
Relative To Container : 相對容器設定自身大小
Fixed :設定固定的寬高
-
WKInterfaceGroup 布局容器
貌似其他的WKInterfaceObject子類對象都不能重疊,隻有這個類可以同其他的WKInterfaceObject對象重疊布局。相當于Android的layout布局控件。
- WKInterfaceTable 清單視圖
相對于UITableView,不需要設定delegate和dataSource。在初始化的時候直接設定行數和樣式。
通過-setNumberOfRows:withRowType:
通過-rowControllerAtIndex:枚舉每個行進行設定。
通過rowController設定cell樣式,相當于UITableViewCell。rowController繼承自NSObject,這點同其他WK元件不同。顯示邏輯需要在SB中設定,并綁定。細節看代碼
-(void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex 實作這個方法接受table的點選回調,不需要也無法設定delegate。
- Menu 視圖
在SB中加入Context Menu,長按螢幕呼出。
可以通過SB或者代碼的方式設定Menu Item。上下文環境調用以下方法添加:
-addMenuItemWithItemIcon:title:action:
-addMenuItemWithImageNamed:title:action:
-addMenuItemWithImage:title:action:
-clearAllMenuItems
除了用SB設定和以上方法外,無法擷取WKInterfaceMenu和WKInterfaceMenuItem的執行個體或者代理。
- WKInterfaceImage
相當于UIImageView
-setImageNamed: 擷取Watch App的圖檔,注意這個圖檔必須存儲在Watch App,手表自己的bundle裡。Extension中的圖檔用這個方法是無法顯示的。
-setImage: -setImageData: 從Extension中擷取圖檔,通過藍牙傳送到手表。
可以通過WKInterfaceDevice 的 -addCachedImage:name: 方法将Extension中擷取的圖檔緩存到手表中。每個 app 的 cache 的尺寸大約是 20M,超過的話 WatchKit 将會從最老的資料開始删除,以騰出空間存儲新的資料。
8、導航開發
- 棧導航方式,類似UINavigationController。觸碰左上角可傳回
-pushControllerWIthName:context: 第一個參數是Controller對應的Identifier字元串,在SB中設定。可通過content傳遞資料。
-popController
-popToRootController
- modal方式。行為基本同UIKit一樣,不同的是觸碰左上角可傳回
-presentControllerWithName:context:
-dismissController
- 分頁導航。類似UIPageController。左右滑動切換
-presentControllerWithNames:contexts: 傳入 names 和 contexts數組,通過這種方式被呼出的 Controller 将以 page 導航方式呈現。
所有的導航方式都可以通過代碼或者SB的方式實作。
9、其他
- 不能執行需要權限的任務,例如在watch中請求位置權限
- 不要在watch中進行背景任務
- 不要在watch中執行複雜邏輯、耗時任務
- watch中無法播放視訊
- cache尺寸隻有20M
- 傳感器API未開放
- 動畫API未開放,用一組幀圖檔代替
10、 Demo
- https://github.com/darcyzhang/CloudWatch
- 需要xcode6.2以上版本運作
- 選iwatch WatchKit App運作
Apple Watch 開發詳解