天天看點

Apple Watch 開發詳解

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應用 有通知的時候喚起,可添加合适的按鈕
Apple Watch 開發詳解
Apple Watch 開發詳解
Apple Watch 開發詳解

3、兩種通知顯示方式

  • 兩種顯示模式
Short Look Long Look
檢視螢幕上包含應用圖示、名稱、簡單通知内容等資訊 應用圖示和名稱将會移至螢幕頂端,内容占據主要的顯示空間,佩戴者可以滑動來完成其它互動
Apple Watch 開發詳解
Apple Watch 開發詳解
  • 兩種載入模式
static dynamic
直接載入 初始化interfaceController後載入
Apple Watch 開發詳解
Apple Watch 開發詳解

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 開發詳解