鍍金池/ 教程/ iOS/ Watch 應(yīng)用結(jié)構(gòu)
上下文菜單
更新記錄
文本與標(biāo)簽
使用 iOS 技術(shù)
開發(fā)您的 Watch 應(yīng)用
Watch 應(yīng)用結(jié)構(gòu)
預(yù)覽概要
界面對象
UI 概要
Tables
配置 Xcode 項(xiàng)目
圖片
通知要點(diǎn)
設(shè)置
界面導(dǎo)航
管理你的預(yù)覽界面
管理自定義 Long Look 界面

Watch 應(yīng)用結(jié)構(gòu)

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。

Watch 應(yīng)用的生命周期

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)用各階段生命周期中執(zhí)行的任務(wù)

在應(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)用之前,任何更改界面對象的企圖都是被忽略的。

在模擬器上進(jìn)行測試

測試期間,您可以通過鎖定與解鎖您的模擬器來驗(yàn)證是否達(dá)到了你的預(yù)期的效果。當(dāng)您在使用 Hardware > Lock 命令時(shí),WatchKit 會調(diào)用當(dāng)前控制器的 didDeactivate 方法。當(dāng)您解鎖了模擬器,WatchKit 會執(zhí)行當(dāng)前控制器的 willActivate 方法。

與 Containing iOS 應(yīng)用共享數(shù)據(jù)

如果您的 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。

與 Containing iOS 應(yīng)用進(jìn)行通信

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é)果。

上一篇:設(shè)置下一篇:文本與標(biāo)簽