1、Apple Watch簡介:html
兩個不一樣的可執行文件:ios
a>在Apple Watch上運行的Watch應用,Watch應用只包含與應用程序的用戶界面有關的storyboards和資源文件。編程
b>在用戶iPhone上運行的WatchKit應用擴展,WatchKit應用擴展則包含了用於管理、監聽應用程序的用戶界面以及響應用戶交互的代碼。服務器
注意:Watch應用須要儘量實現Apple Watch提供的全部交互動做。因爲Watch應用目的在於擴展iOS應用的功能,所以Watch應用和WatchKit應用擴展將被捆綁在一塊兒,而且都會被打包進iOS應用包。若是用戶有與iOS設備配對的Apple Watch,那麼隨着iOS應用的安裝,系統將會提示用戶安裝相應的Watch應用。app
2、Watch App操做步驟:編輯器
a>建立Watch應用ide
b>建立Glance界面工具
b>自定義通知界面佈局
3、配置Xcoe項目:字體
一、向iOS應用中添加Watch應用:
1. 打開現有的iOS應用項目.
2. 選擇 File > New > Target,而後選中Apple Watch
3. 選擇 Watch App
4. 單擊 Next
5. 若是您想要使用glance或者自定義通知界面,請選擇相應的選項, 咱們建議您激活應用通知選項。選中以後就會建立一個新的文件來調試該通知界面。若是您沒有選擇這個選項,那麼以後您只能手動建立這個文件了。
6. 單擊 Finish
二、應用對象的結構:
Watch App ——————> WatchKit Extension ——————> iOS App
Watch App Target ——————> WatchKit Extension Target ——————> iOS Target
三、編譯、運行以及調試程序
爲glance和通知配置自定義編譯方案:
1. 選擇現有的Watch應用方案.
2. 從方案菜單中選擇Edit Scheme.
3. 複製現有的Watch應用方案,而後給新方案取一個合適的名字。好比說,命名爲「Glance - My Watch app」,表示該方案是專門用來運行和調試glance。
4. 選擇方案編輯器左側欄的Run選項
5. 在信息選項卡中,選擇合適的可執行對象
6. 關閉方案編輯器以保存更改
4、Watch應用的體系結構:
1、Watch應用和WatchKit應用擴展之間的通訊:
Apple Watch : Watch App ——————> WatchKit
iPhone : WatchKit Extension ——————> WatchKit
2、啓動Watch應用:
Apple Watch : Watch App ——————>Load Initial interface controller ——————> initialize UI ( initWithContext方法) ——————> Display UI(willActivate方法)
3、界面控制器的生命週期:
Apple Watch : Launch App ——————> Load UI ——————> initialize UI(initWithContext方法) ——————> Display UI(willActivate方法) ——————> Load Initial interface controller(Various action methods 方法) ——————> User stops interacting(didDeactivate方法)
4、WKInterfaceController的主要方法:
- (void)awakeWithContext:(nullable id)context;
這個方法用來準備顯示界面。藉助它來加載數據,以及更新標籤、圖像和其餘在故事板場景上的界面對象。
- (void)willActivate;
這個方法可讓您知道該界面是否對用戶可視。藉助它來更新界面對象,以及完成相應的任務,完成任務只能在界面可視時使用。
- (void)didDeactivate;
使用didDeactivate方法來執行全部的清理任務。例如,使用此方法來廢止計時器、中止動畫或者中止視頻流內容的傳輸。您不能在這個方法中設置界面控制器對象的值,在本方法被調用以後到willActivate方法再次被調用以前,任何更改界面對象的企圖都是被忽略的。
五、與Containing iOS應用共享數據:
若是您的iOS應用和WatchKit應用擴展都依賴於相同的數據,那麼您可使用共享程序組來存儲數據。共享程序組是一個位於本地文件系統的區域,應用擴展和應用都可以訪問。因爲兩個程序在不一樣的沙箱環境中運行,它們通常狀況下都不與對方共享文件和進行通訊。共享程序組讓共享數據成爲可能。你可使用這個空間來存儲共享的數據文件或者在兩個程序間交換消息。
您能夠在iOS應用和WatchKit應用擴展中的Capabilities選項卡中啓動共享程序組。激活這項功能後,Xcode將會爲每一個對象添加受權文件(須要的話),並給那個文件添加com.apple.security.application-groups受權。要共享數據,這兩個對象必須選擇相同的共享程序組。
程序運行時,您能夠經過在共享容器目錄中讀寫文件以在兩個程序間共享數據。要訪問容器,請使用NSFileManager中的containerURLForSecurityApplicationGroupIdentifier:方法來接收該目錄的根路徑。使用方法返回的URL來枚舉目錄內容或者在目錄中爲文件建立新的URL。
5、使用iOS技術注意事項:
一、避免使用須要用戶權限的技術,好比Core Location。在WatchKit應用擴展中使用該技術的話,可能會在您第一次請求使用時致使用戶的iPhone上顯示出一個意想不到的提示。更糟糕的是,這個情況可能會在任什麼時候間出現,即便用戶的iPhone在他們的口袋裏而且屏幕是鎖定的。
二、不要使用後臺執行模式的技術。WatchKit應用擴展只考慮在前臺運行的狀況,而且其只在用戶和對應的Watch應用交互時運行。所以,支持後臺運行的某些技術在WatchKit應用擴展中並不被支持。
三、避免使用須要長時間運行的技術。WatchKit應用擴展在用戶中止和對應的Watch應用交互後便迅速暫停。因爲與Watch應用的交互一般是短暫的,所以應用擴展可能會在請求的數據到達前暫停運行。
6、WatchKit App 概要:
一、界面控制工做流程:
界面控制器(Interface controller)管理你storyboard的場景內容。每一個界面控制器都使用outlet來保存場景中的引用對象,並定義action方法來響應用戶交互。在運行時,你可使用界面控制器的initWithContext:和willActivate方法來配置界面。在這些方法裏,你的操做任務以下:
a》獲取你想展現的數據。
b》設置初始化和配置標籤,圖片和其餘控件。
c》根據你的須要,展現或隱藏你的界面對象。
二、整合你的故事版場景:
三、在運行時更新界面:
在運行過程當中,界面控制器能讓對象在相應的storyboad場景中作以下改變:
a》設置或修改數據變量。
b》支持改變對象的外觀。
c》改變對象的透明度。
d》顯示或隱藏對象。
Responding to User Interactions(響應用戶界面方法):
- (IBAction)buttonAction:
- (IBAction)pickerAction:(NSInteger)index:
- (IBAction)switchAction:(BOOL)on:
- (IBAction)sliderAction:(float)value:
- (IBAction)menuItemAction:
四、界面的國際化:
對於文本和圖片的國際化處理,可使用iOS和OS X應用相同的技術:
a》使用NSLocalizedString宏來從資源文件夾加載字符串。
b》使用NSNumberFormatter對象來格式化數值型變量。
c》使用NSDateFormatter對象來格式化日期。
7、WatchKit App 界面導航:
a》實現分層界面:
在該界面控制器中,您能夠經過調用當前界面控制器的pushControllerWithName:context:方法在屏幕上推出一個新的界面控制器。
想要解除界面控制器,可調用其popController方法。
b》實現基於分頁的界面:
能夠建立下一頁的segue,以便在app的storyboard文件中配置分頁界面。想要建立該segue:
1.對您但願做爲第一屏的界面控制器執行Control-click操做,並將其拖拽到不一樣的界面控制器中。
應該強調第二個界面控制器,以指明segue是可用的。
2.釋放鼠標按鈕。
3.從relationship segue面板中選擇next page。
一般在storyboard文件中配置一組初始的頁面集合。當app啓動時,WatchKit會實例化和初始化您的初始界面控制器,而後是分頁界面中的其餘界面控制器。若是您想改變一組界面控制器,請在初始界面控制器的init方法中調用reloadRootControllersWithNames:contexts:方法。調用該方法會使得WatchKit在嘗試展現界面中任何其餘頁面以前加載新的界面控制器。您也能夠在app運行時調用reloadRootControllersWithNames:contexts:方法來改變展現中的頁面集合。
當系統加載您的WatchKit app界面時,它將實例化和初始化組成界面的全部界面控制器。當用戶從一個界面控制器切換至下一個時,它將調用當前界面控制器的didDeactivate方法,以及即將展現的界面控制器的willActivate方法。willActivate方法可確保界面中的信息是最新的。
c》以模態形式展現界面控制器
一、調用presentControllerWithName:context:方法來模態地展現單個界面控制器。
二、調用presentControllerWithNames:contexts:方法展現兩個或者多個使用分頁佈局的界面控制器。
7、WatchKit App 界面對象:
1、建立界面對象:
@property (weak, nonatomic) IBOutlet WKInterfaceLabel* label;
二、在設計階段配置界面:
注意:可使用一個WKInterfaceLabel對象來更改標籤的文本、顏色以及字體,不過卻不能更改它的行數或者是行高。
三、在運行時更改界面:
- (instancetype)initWithContext:(id)context {
// Always call super first.
self = [super initWithContext:context];
if (self){
// It is now safe to access interface objects.
[self.label setText:@「Hello New World」];
}
return self;
}
四、響應用戶交互:
請使用按鈕、開關以及其餘的交互控件來更改應用狀態。當點擊按鈕或某一控件的值發生變化時,WatchKit會調用界面控制器中相關的動做方法(action method)。每種界面對象針對其動做方法都有一個必須的格式,以下所示:
- (IBAction)buttonClicked;
五、隱藏界面對象:
在設計佈局時,隱藏起某些項目就能夠當作是將其從佈局中徹底刪除。若是要隱藏某個對象,只須要調用setHidden:方法併爲其傳遞YES值就好了。
8、WatchKit App 文本、標籤以及圖片:
一、使用自定義字體:
UIFont* menloFont = [UIFont fontWithName:@"Menlo" size:12.0];
NSAttributedString *attrString = [[NSAttributedString alloc]
initWithString:@"My Formatted Text"
attributes:@{NSFontAttributeName: menloFont}];
[self.myCustomFontLabel setAttributedText:attrString];
二、自定義系統字體:
三、國際化您的文本代碼:
使用基於Xcode國際化支持的storyboard和xib文件。基於國際化可讓你僅僅只用一個storyboad文件就能支持全部的本地化。本地化字符串分別存在特定的區域語言字符串中。
使用NSLocalizedString類的宏定義來讓程序自動檢索本地化字符串。
經過NSNumberFormatter類使用用戶所在區域和本地的設置來格式化數值型的值。
經過NSDateFormatter類使用用戶所在區域和本地設置來格式化時間。
9、WatchKit App 表格:
一、配置Row Types:
Row Type是一個在table中以單行形式展現數據的模板。每一個table必須至少有一個row type,您能夠根據需求定義額外的row type。您能夠用row type區分table中的不一樣內容。好比您可能在內容行上、標題和註腳上使用不一樣的類型。當您爲界面控制器場景添加table時,Xcode會自動建立初始的row types供您配置。
爲table添加row types:
a>在storyboard文件中選中table對象.
b>打開Attributes inspector.
c>使用Rows屬性更改可用row type數量.
爲row type定義一個row controller類:
a>爲WatchKit擴展添加一個新的Cocoa Touch類
b>讓新類繼承NSObject
c>爲每一個計劃在運行時訪問的標籤、圖片或者控件添加聲明的屬性。聲明屬性可以使用如下格式,請更改類以匹配相應的界面對象
在storyboard中配置row type:
a>在storyboard文件中選中row controller對象
b>將row controller的Identifier屬性設置爲惟一值,隨後您會在建立表格行時使用該標識符。在行類型中該值必須是惟一的,可是實際值仍是由您來定奪。在Attributes inspector中設置該值。
c>將row type的類設置爲您的自定義類。您須要在Identity inspector中設置類信息。將row type元素和類中對應的outlets鏈接起來
d>將storyboard文件中的項目和outlets鏈接並綁定。當您在代碼中配置table時,WatchKit會在運行時使用該信息實例化對應的類
二、運行時配置table內容:
建立並配置列表行:
a>先決定你須要建立的行的數目和類型,這取決於你想要展現的數據類型
b>使用setRowTypes:或者setNumberOfRaws:withRowType:方法來建立。這兩個方法都會在界面上建立新的列表行,而且會在WatchKit擴展中實例化對應的類。這些實例被保存在table中,且可經過rowControllerAtIndex:方法訪問
c>使用rowControllerAtIndex:方法遍歷表格中的每一行
d>使用row controller對象來配置每一行中的內容
10、WatchKit App 情景菜單:
一、設計菜單項:
每一個菜單項包含一個可點擊區域和一個標題。可點擊區域由純色背景和您提供的圖片組成。圖片必須是模板圖片,其alpha通道指定了繪製在純色背景上的圖形。
二、爲界面控制器添加情景菜單:
情景菜單中的菜單項目總數不能超過4個,無論是在storyboard文件中定義仍是以編程方式添加,或者組合兩種方式。
1.打開storyboard文件。
2.從工具庫中拖拽一個菜單項,並將其添加到界面控制器場景中。初始菜單包含一個單獨的菜單項目。
3.最多從庫中拖拽3個菜單項到菜單中。你還可使用菜單的Attributes檢查器來設置菜單項數量,您添加的菜單項不能被移除。
4.對於每一個菜單項目,可以使用Attributes檢查器來指定菜單的標題和圖片,這二者都是須要的。
5.在界面控制器類中將每一個菜單項和操做鏈接起來。菜單操做方法格式以下:
- (IBAction)doMenuItemAction
想要在運行時添加菜單項目,請調用界面控制器對象的addMenuItemWithImage:title:action:或者addMenuItemWithImageNamed:title:action:方法。您添加的菜單項被附加到storyboard文件中指定的對象上。以編程方式添加的菜單項目持續附屬於菜單,直到您明確地移除它們或者您的界面控制器解除配置。
11、Glance開發基礎:
一、Glance的生命週期:
Glance界面控制器的生命週期和其餘WatchKit界面控制器同樣,不過glance的界面控制器的初始化要早於其它,以便於glance能快速的顯示給用戶。
二、Glance界面指南:
遵循下面的指南來填充內容:
1.Glance的設計目的在於快速的傳達信息。不要顯示一堆文字。適當的使用圖像、顏色和動畫來快速傳達信息。
2.聚焦在最重要的數據上。Glance不是你的應用的替代。就像Watch app是對應的iOS app的縮水版,你也能夠把glance看作Watch app的縮水版。
3.不要在glance界面中包含交互控件。好比按鈕、選擇器、滑動器和菜單。
4.避免使用表格和地圖。儘管並無禁止你這麼作,手錶上有限的控件讓表格和地圖不是那麼有用。
5.讓顯示的信息保持及時。使用全部可用的資源,包括時間和地理位置,來向用戶提供有用的信息。而且注意更新你的glance,以免由於glance初始化到顯示花費的時間而讓信息過期。
12、管理Glance界面:
一、實現一個Glance界面控制器:
a.使用initWithContext:方法來初始化你的glance界面,而且設置標籤和圖像的初始值。
b.基於內容的改變,使用willActivate來更新glance。
二、自定義從Glance啓動應用:
在觸摸glance時啓動並顯示一個不一樣的界面控制器,你須要按以下步驟操做:
a.在glance界面控制器中:
配置glance的initWithContext: 和 willActivate ,這一步和其餘狀況是相同的。
調用updateUserActivity:userInfo:方法,而且使用userinfo參數來傳達你的應用glance的狀態。
b.在你的應用的主界面控制器:
實現actionForUserActivity:context: 方法,使用提供的userinfo字典來肯定顯示哪一個界面控制器,你還應該生成一個上下文對象並將它傳遞給指定的界面控制器。
十3、Notification 通知的一些要點:
一、Short-Look 界面
Short-Look 界面是一個不可滾動的視圖,而且不能夠被定製。系統使用一個通用的模板來顯示應用名稱、圖標,以及存儲在本地或遠程通知消息中的標題。
二、Long-Look 界面
Long-Look 界面是一個可滾動的界面,它顯示了通知的所有內容,以及全部的關聯按鈕。若是您沒有提供自定義的通知界面,那麼 Apple Watch將會顯示默認界面,裏面包括了應用圖標、通知的標題,以及提示消息。而若是您提供了自定義的通知界面,那麼 Apple Watch 將會顯示它。
Long-Look 通知界面分爲三個區域:
a.Sash頂部——》System-Provided
b.Content Area中間部分——》App-Provided content
c.Bottom Area——》App-Defined actions
三、爲通知上添加按鈕
按鈕經過爲通知提供封裝的動做響應來幫用戶節省時間。Apple Watch使用iOS 應用註冊的交互通知界面來顯示按鈕。在 iOS 8 以及更高版本中,應用都須要使用UIUserNotificationSettings 對象來註冊它們顯示的生成通知對話框。一旦對象建立,應用也一樣能夠指定自定義通知類別以及其對應的按鈕動做。Apple Watch使用這個類別信息來添加相應的按鈕到 Long-Look 界面上。
四、讓按鈕響應單擊動做
前臺按鈕動做將啓動您的 Watch 應用,而後將按下的按鈕的 ID 傳遞給主界面控制器。
十4、Notification 自定義通知界面:
一、自定義通知界面含有兩個獨立的界面:
一個靜態界面:靜態界面是一個簡單的界面,它僅僅只含有通知的提示信息,以及您在設計時配置的靜態圖像以及文本信息。
一個動態界面:動態界面顯示了完整的自定義通知內容樣式,而且它能夠包含由 WatchKit 擴展提供的定製內容和圖形。
二、配置自定義界面的通知類型:
當生成遠程通知時,您的服務器要經過在其`aps`字典中包含category鍵的值來指定通知類型。`category`的鍵值要和您在 iOS 應用以及您在通知類別對象中的 Name 屬性指定的同樣。例如,在圖15-2中,類別文本是`MeetingInvite`。
三、配置靜態通知界面:
a.全部的圖像必須駐留在 Watch 應用包中
b.界面不能包含控件、表格、地圖,以及其餘交互元素
c.界面的`notificationAlertLabel`輸出口必須與某個標籤相關聯。標籤的文本設置爲通知的警告信息。其餘的標籤文本不變,而且只可以在設計時設置。
d.除了和`notificationAlertLabel`輸出口相連的標籤外,在靜態通知場景中的標籤和圖像是不可以改變的。當您在設計界面時請記住這條準則,並確保每一個標籤的文本是合適的。
四、配置動態通知界面:
動態通知界面給用戶提供了一個更豐富的通知體驗。藉助動態界面,您能夠顯示不少的內容。您能夠添加額外的信息,配置多個標籤,動態地生成內容,等等。
五、設計動態界面
可在絕大多數界面上使用標籤、圖像、組以及分隔符。
您可能想要在須要的時候使用表格和地圖。
不要包含有按鈕、開關,或者其餘交互控件。
六、在運行時配置動態界面
界面初始化以後,WatchKit將負載數據傳輸到通知界面控制器的不一樣方法中。對於遠程通知來講,WatchKit 調用didReceiveRemoteNotification:withCompletion:方法。對於本地通知來講,它調用didReceiveLocalNotification:withCompletion:方法。請使用接受到的數據來配置您的通知界面。界面配置完成後,您必需要調用所提供的完成處理代碼塊來讓 WatchKit 知道您的界面已經準備就緒。
Watch App ——————>Locate the custom UI in the notification storyboard( init方法 ) ——————> Process the notification( didReceiveRemoteNotification:withCompletion:方法 ) ——————> Display the Notification UI