Apple Watch 開發詳解
Apple Watch現在對於第三方開發者來說更多的還是一塊額外的屏幕。暫時WatchKit沒有能給出足夠的接口。現在Watch App的主要運算邏輯需要依賴iPhone,Apple也承諾會有原生的手表App,可能要等到Apple Watch和WatchKit的完全版面世的時候。
1、兩種屏幕分辨率
屏幕尺寸 | 38mm | 42mm |
---|---|---|
分辨率 | 272 x 340 | 312 x 390 |
寬高比 | 4:5 | 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通訊
-
Watch App 控制流
-
ViewController 生命周期
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
-
需要xcode6.2以上版本運行
-
選iwatch WatchKit App運行