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