Apple Watch開發文檔--3

WatchKit App架構

在實現app的界面時,WatchKit app和WatchKit extension是串行工作的.當用戶與Apple Watch上的app進行交互時,WatchKit app從故事版(storyboard)中選擇合適的場景與之交互.例如,當用戶查看app的glance的時候,它選擇一個glance情景. 在選擇這個情景之後,WatchKit 告知它配對的iPhone去啓動WatchKit extension並且創建管理這個情景的對象.當情景完全配置好之後,它被展示到Apple Watch上. 信息在WatchKit app和WatchKit extension的傳遞是透明的.
這裏寫圖片描述

            圖3-1 WatchKit app和WatchKit extension之間的交流

管理場景:界面控制器

每個場景被單個界面控制器對象管理,界面控制器對象是WKInterfaceController類的實例. 在WatchKit中的界面控制器和iOS中的view controller類似:它用於呈現和管理屏幕上的內容,並處理用戶和內容的交互.不像view controller,interface controller不負責管理界面上的view. 這些View被WatchKit在情景背後管理.

WatchKit app典型的保護多個interface controller,每個負責展示不同類型的信息.因爲每一個時刻只有一個界面控制器展示在屏幕上,app 展示新的界面控制器來響應用戶的操作. App可以模態的呈現界面控制器. app導航的樣式同樣覺得了界面控制器如何被展現. 如何展現一個新的界面控制器,看這裏

注意:Glance和自定義的通知界面使用不同於其他界面控制器的特定的界面控制器.關於glance的實現,可以看Galance Essentials 關於自定義通知界面的實現,可以看Notification Essentials

WatchKit App 的生命週期

用戶與Apple Watch的交互驅使了app的啓動和它的生命循環.使用者可以通過點擊主屏幕啓動,與glance交互啓動,從定製的通知視圖中啓動. 這些交互中的每一個啓動WatchKit app和與之相關的WatchKit extension. 你的WatchKit app和WatchKit 來來回回的傳遞數據,直到用戶停止與你的app進行交互,這時候iOS 掛起extension 直到下一次交互到來.

在運行過程中,WatchKit 自動爲當前的交互加載合適的場景. 如果用戶查看app的glance,WatchKit從故事板中加載glance的場景;如果用戶直接啓動你的app,WatchKit爲你的app加載初始化的場景. 隨後,他加載場景,WatchKit 要求WatchKit extensions創建相關的界面控制器對象,這些對象用來準備展示給用戶的場景. 圖3.2展示了這個步驟. 你可以通過了解界面控制器如何工作的在[App Essentials]

                  圖3.2 啓動一個WatchKit app

使用界面控制器的init和awakeWithContext加載任何界面控制器展示需要的數據.不要使用willActivate初始化你的控制器. willActivate在你的控制器將要被展示到屏幕立即被調用,因此你可以在最後時刻做一些改變. 例如,你可能只有在整個控制器被展示在屏幕上時,做一些動畫和其他的任務.

當界面控制完全展示到屏幕上時,用戶可以通過控制器定製的行爲方法去交互.當用戶與列表,按鈕,轉換按鈕,進度條,和其他控件進行交互時,WatchKit調用相關的行爲方法與之交互.你使用這些交互方法來處理界面更新和其他相關的任務. 可以使用定時器(NSTimer)對象在你指定的時間去處理任務。

注意:Glance界面不支持事件方法. 點擊你的Glance界面總是啓動你的應用.

只有用戶與你Apple Watch的app進行交互的時候,WatchKit extension才保持運行. 與Apple Watch的交互是簡單的,因此界面控制器應該是輕量級的,並且不能跑耗時的任務. 當用戶退出或者停止與你Apple watch交互,iOS不激活當前的界面控制器並且掛起你的extension,如圖3-3

圖3-3 界面控制器的生命週期

                          圖3-3 界面控制器的生命週期

App生命週期不同階段的任務

在app的不同階段,iOS 通過調用WKInterfaceController對象的方法做迴應.表3-1 列出了你需要在界面控制器中實現的關鍵方法,已經你需要在方法中乾的任務.

Method 功能
init 你初始化界面控制器的第一次機會
awakeWithContext 這個方法讓你通過可用的context data去配置界面控制器 用它來加載數據和更新故事板中的標籤,圖像,表格和其他控制器對象 context data是幫助生成新的控制器的數據 例如,在一個層級對象中push一個新的控制器對象,你可以指定傳遞給下一個層次的context data. 推薦但不強制 提供一個context data.
willActivate 這個方法告訴你你的界面馬上要被用戶看到. 使用這個方法可以對控制器做一些小的改變. 例如,你可以使用這個方法來更新標籤上的數據. 更多的任務應該放到init和awakeWithContext方法中
didDeactivate 使用didDeactivate方法來清理你的界面控制器,使它返回到靜止的狀態. 例如,使用這個方法是定時器失效,停止動畫.在這個方法中,你不能設置任何值. 這個方法被調用的時候,willActivate方法會被再次調用,任何視圖對控制器的設置都會被忽略.

在模擬器中調試激活的代碼

在測試期間,你可以鎖定,解鎖來驗證你的激活和非激活代碼是否如期望的那樣. 當你使用硬件->鎖定來鎖定模擬器時,WatchKit 會調用當前控制器的didDeactivate方法. 當你隨後調用解鎖,WatchKit會調用willActivate方法.

與iOS app共享數據

如果你的iOS app和WatchKit extension依靠同樣的數據,使用一個共享的文件夾來存放數據. app文件夾是一個多進程可以操作的安全容器. 因爲你的WatchKit extension和iOS app運行與獨立的沙盒環境,他們通常不會共享文件和互相交流.app文件夾可以讓兩個進程共享文件和用戶的默認設置.

設置一個共享的文件夾在iOS app和WatchKit extension之間. 通過在target中添加一個entitlements 文件(必須的)和 在文件上添加com.apple.security.application-groups 來開啓app文件夾. 爲了共享數據,每個target必須選擇相同的app文件夾.

在運行期間, 你通過在共享的目錄下面讀寫這些文件來達到數據的共享. 使用NSFileManager的這個containerURLForSecurityApplicationGroupIdentifier方法來獲取基地址來訪問共享目錄. 通過提供的URL迭代文件夾的內容,在目錄中給文件創建新的URLs.

爲了在app之間共享數據,基於共享目錄創建一個NSUserDefaults的對象. 通過NSUserDefaults的initWithSuiteName:的方法創建對象,來訪問共享的默認數據. 所以的操作都可以讀或者寫.

直接與包含它的iOS app交流

Apps與其包含它的應用合作緊密,可以通過openParentApplication:reply:這個方法發送對app發送接受請求. WatchKit extensions不支持後臺執行模式;他們只在用戶與Apple watch上的交換時才運行. 他們的container iOS app幾乎沒有限制,可以在後臺運行,或者代表WatchKit extension收集信息. 活動完成可能需要花費額外的時間,例如獲取用戶的位置,這樣應該讓iOS app操作,再返回來與WatchKit extension交互.

當你調用openParentApplication:reply: 方法的時候,iOS在後臺啓動和喚醒containing iOS app,調用app 的application:handleWatchKitExtensionRequest:reply: 回調方法
這個回調使用提供的字典數據,發起請求,並給WatchKit extension一個迴應.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章