Apple Watch 應(yīng)用程序包含兩個(gè)部分:Watch 應(yīng)用和 WatchKit 應(yīng)用擴(kuò)展。Watch 應(yīng)用駐留在用戶的 Apple Watch 中,只含有故事板和資源文件,要注意它并不包含任何代碼。而 WatchKit 應(yīng)用擴(kuò)展駐留在用戶的 iPhone 上(在關(guān)聯(lián)的 iOS 應(yīng)用當(dāng)中),含有相應(yīng)的代碼和管理 Watch 應(yīng)用界面的資源文件。
當(dāng)用戶開(kāi)始與 Watch 應(yīng)用交互時(shí),Apple Watch 將會(huì)尋找一個(gè)合適的故事板場(chǎng)景來(lái)顯示。它根據(jù)用戶是否在查看應(yīng)用的 glance 界面,是否在查看通知,或者是否在瀏覽應(yīng)用的主界面等行為來(lái)選擇相應(yīng)的場(chǎng)景。選擇完場(chǎng)景后,Watch OS 將通知配對(duì)的 iPhone 啟動(dòng) WatchKit 應(yīng)用擴(kuò)展,并加載相應(yīng)對(duì)象的運(yùn)行界面。所有的消息交流都在后臺(tái)進(jìn)行。
圖 3-1 Watch 應(yīng)用和 WatchKit 應(yīng)用擴(kuò)展之間的通信
http://wiki.jikexueyuan.com/project/apple-watch-programming-guide/images/app_communication_2x.png" alt="Watch 應(yīng)用和 WatchKit 應(yīng)用擴(kuò)展之間的通信" />
您 Watch 應(yīng)用的構(gòu)建模塊是界面控制器,它是 WKInterfaceController 類的實(shí)例。WatchKit 中的界面控制器用來(lái)模擬 iOS 中的視圖控制器:它顯示、管理屏幕上的內(nèi)容,并且響應(yīng)用戶交互。
如果用戶直接啟動(dòng)您的應(yīng)用,系統(tǒng)將從主故事板文件中加載初始界面控制器。根據(jù)用戶的交互,您可以顯示其他界面控制器以讓用戶得到需要的信息。如何顯示額外的界面控制器取決于您應(yīng)用所使用的界面樣式。WatchKit 支持基于頁(yè)面的風(fēng)格以及基于層次的風(fēng)格。這兩個(gè)風(fēng)格不能共存的,要了解更多信息,請(qǐng)參閱:Interface Navigation。
重要提示
Glances 和通知只會(huì)顯示一個(gè)包含相關(guān)信息的界面控制器。用戶與界面控制器的交互操作會(huì)展示應(yīng)用的主界面。要了解如何實(shí)現(xiàn) glance,請(qǐng)參閱 Glance Essentials。要了解自定義通知界面,請(qǐng)參閱:Notification Essentials。
Apple Watch 上的用戶交互將啟動(dòng)您的應(yīng)用并驅(qū)動(dòng)其生命周期。當(dāng)用戶在 Apple Watch 上運(yùn)行您的應(yīng)用時(shí),用戶的 iPhone 會(huì)自行啟動(dòng)相應(yīng)的 WatchKit 應(yīng)用擴(kuò)展。通過(guò)一系列的信號(hào)交換,Watch 應(yīng)用和 Watch 應(yīng)用擴(kuò)展將互相連接,因此消息能夠在二者之間流通,直到用戶停止與應(yīng)用進(jìn)行交互為止。此時(shí),iOS 將暫停應(yīng)用擴(kuò)展的運(yùn)行。
隨著啟動(dòng)序列的運(yùn)行,WatchKit 自動(dòng)為當(dāng)前界面創(chuàng)建相應(yīng)的界面控制器。如果用戶正在查看 glance,WatchKit 創(chuàng)建出來(lái)的界面控制器將與 glance 相連接。如果用戶直接啟動(dòng)您的應(yīng)用,WatchKit 將從應(yīng)用的主故事板文件中加載初始界面控制器。無(wú)論哪種情況,WatchKit 應(yīng)用擴(kuò)展都提供一個(gè)名為 WKInterfaceController 的子類來(lái)管理相應(yīng)的界面。
界面控制器對(duì)象初始化后,您就應(yīng)當(dāng)為其準(zhǔn)備顯示相應(yīng)的界面。圖 3-2 展示了 Watch 應(yīng)用的啟動(dòng)序列。當(dāng)應(yīng)用啟動(dòng)時(shí),WatchKit 框架自行創(chuàng)建了相應(yīng)的 WKInterfaceController 對(duì)象并調(diào)用 initWithContext: 方法。使用該方法來(lái)初始化界面控制器,然后加載所需的數(shù)據(jù),最后設(shè)置所有界面對(duì)象的值。對(duì)主界面控制器來(lái)說(shuō),初始化方法緊接著 willActivate 方法運(yùn)行,以讓您知道界面已顯示在屏幕上。了解更過(guò),請(qǐng)參閱 App Essentials。
圖 3-2 啟動(dòng) Watch 應(yīng)用
http://wiki.jikexueyuan.com/project/apple-watch-programming-guide/images/launch_cycle_2x.png" alt="啟動(dòng) Watch 應(yīng)用" />
當(dāng)用戶在 Apple Watch 上與應(yīng)用進(jìn)行交互時(shí),WatchKit 應(yīng)用擴(kuò)展將保持運(yùn)行。如果用戶明確退出應(yīng)用或者停止與 Apple Watch 進(jìn)行交互,那么 iOS 將停用當(dāng)前界面控制器,并暫停應(yīng)用擴(kuò)展的運(yùn)行,如圖 3-3 所示。與Apple Watch 的互動(dòng)是非常短暫的,因此這幾個(gè)步驟都有可能在數(shù)秒之間發(fā)生。所以,界面控制器應(yīng)當(dāng)盡可能簡(jiǎn)單,并且不要運(yùn)行長(zhǎng)時(shí)任務(wù)。重點(diǎn)應(yīng)當(dāng)放在讀取和顯示用戶想要的信息上來(lái)。
重要提示
Glance 界面不支持觸摸事件響應(yīng)。點(diǎn)擊你的 glance 界面會(huì)直接進(jìn)入加載應(yīng)用軟件。
您的 Watch Kit 擴(kuò)展包只有在用戶正在觸發(fā) Watch 上的事件的時(shí)候才會(huì)響應(yīng)。這意味著與您的 Watch 進(jìn)行數(shù)據(jù)交互會(huì)非常的簡(jiǎn)短,所以,視圖控制器需要盡可能的輕量級(jí),且不能執(zhí)行耗時(shí)的任務(wù)。當(dāng)用戶退出了您的應(yīng)用軟件,或者是中斷了與 Watch 的交互。iOS 會(huì)檢測(cè)到當(dāng)前的視圖控制器,然后掛起您的操作。
圖 3-3 界面控制器的生命周期
http://wiki.jikexueyuan.com/project/apple-watch-programming-guide/images/watch_app_lifecycle_simple_2x.png" alt="界面控制器的生命周期" />
在應(yīng)用生命周期的不同階段,iOS 將會(huì)調(diào)用 WKInterfaceController 對(duì)象的相關(guān)方法來(lái)讓您做出相應(yīng)的操作。表 3-1 列出了大部分您應(yīng)當(dāng)在界面控制器中聲明的主要方法。
表 3-1 WKInterfaceController 的主要方法
| 方法 | 方法的用途 |
|---|---|
| init | 初始化你的視圖控制器。 |
| awakeWithContext: | 這個(gè)方法用來(lái)準(zhǔn)備顯示界面。借助它來(lái)加載數(shù)據(jù),以及更新標(biāo)簽、圖像和其他在故事板場(chǎng)景上的界面對(duì)象。 |
| willActivate | 這個(gè)方法可以讓您知道該界面是否對(duì)用戶可視。借助它來(lái)更新界面對(duì)象,以及完成相應(yīng)的任務(wù),完成任務(wù)只能在界面可視時(shí)使用。 |
| didDeactivate | 使用 didDeactivate 方法來(lái)執(zhí)行所有的清理任務(wù)。例如,使用此方法來(lái)廢止計(jì)時(shí)器、停止動(dòng)畫或者停止視頻流內(nèi)容的傳輸。您不能在這個(gè)方法中設(shè)置界面控制器對(duì)象的值,在本方法被調(diào)用之后到 willActivate 方法再次被調(diào)用之前,任何更改界面對(duì)象的企圖都是被忽略的。 |
測(cè)試期間,您可以通過(guò)鎖定與解鎖您的模擬器來(lái)驗(yàn)證是否達(dá)到了你的預(yù)期的效果。當(dāng)您在使用 Hardware > Lock 命令時(shí),WatchKit 會(huì)調(diào)用當(dāng)前控制器的 didDeactivate 方法。當(dāng)您解鎖了模擬器,WatchKit 會(huì)執(zhí)行當(dāng)前控制器的 willActivate 方法。
如果您的 iOS 應(yīng)用和 WatchKit 應(yīng)用擴(kuò)展都依賴于相同的數(shù)據(jù),那么您可以使用共享程序組來(lái)存儲(chǔ)數(shù)據(jù)。共享程序組是一個(gè)位于本地文件系統(tǒng)的區(qū)域,應(yīng)用擴(kuò)展和應(yīng)用都能夠訪問(wèn)。由于兩個(gè)程序在不同的沙箱環(huán)境中運(yùn)行,它們一般情況下都不與對(duì)方共享文件和進(jìn)行通信。共享程序組讓共享數(shù)據(jù)成為可能。你可以使用這個(gè)空間來(lái)存儲(chǔ)共享的數(shù)據(jù)文件或者在兩個(gè)程序間交換消息。
您可以在 iOS 應(yīng)用和 WatchKit 應(yīng)用擴(kuò)展中的 Capabilities 選項(xiàng)卡中啟動(dòng)共享程序組。激活這項(xiàng)功能后,Xcode 將會(huì)為每個(gè)對(duì)象添加授權(quán)文件(需要的話),并給那個(gè)文件添加 com.apple.security.application-groups 授權(quán)。要共享數(shù)據(jù),這兩個(gè)對(duì)象必須選擇相同的共享程序組。
程序運(yùn)行時(shí),您可以通過(guò)在共享容器目錄中讀寫文件以在兩個(gè)程序間共享數(shù)據(jù)。要訪問(wèn)容器,請(qǐng)使用 NSFileManager 中的 containerURLForSecurityApplicationGroupIdentifier:方法來(lái)接收該目錄的根路徑。使用方法返回的 URL 來(lái)枚舉目錄內(nèi)容或者在目錄中為文件創(chuàng)建新的 URL。
Watch 使用方法 openParentApplication:reply: 來(lái)給 iOS 發(fā)送請(qǐng)求并等待回復(fù)。WatchKit 擴(kuò)展包并不支持后臺(tái)運(yùn)行;它只會(huì)在用戶直接主動(dòng)觸碰它時(shí)才會(huì)響應(yīng)。containing iOS 應(yīng)用在設(shè)置上有許多限制,他可以被配置成后臺(tái)收集 WatchKit 擴(kuò)展包的數(shù)據(jù)的模式。有些事件可能需要額外的時(shí)間來(lái)完成,例如接收用戶定位的數(shù)據(jù),這個(gè)就需要通過(guò) iOS 來(lái)收集數(shù)據(jù),然后傳輸給 Watch。
當(dāng)您使用 openParentApplication:reply: 方法后,iOS 會(huì)在后臺(tái)啟動(dòng)或者喚醒 containing iOS 應(yīng)用,然后調(diào)用方法 application:handleWatchKitExtensionRequest:reply: 。這個(gè)方法會(huì)用提供的字典數(shù)據(jù)執(zhí)行請(qǐng)求,然后給 WatchKit 擴(kuò)展包反饋結(jié)果。