標籤:
WatchKit app和WatchKit extension一起實現了app的介面。當使用者在Apple Watch中操作時,WatchKit app從storyboards中選擇合適的情境。比如,如果使用者查看glance,它就會選擇glance情境。在選擇情境時,WatchKit通知對應的iPhone啟動WatchKit extension來建立管理情境的對象。當常見完全配置好之後,它會顯示在Apple Watch上。這種在WatchKit app和WatchKit extension中傳遞資料的操作完全是在幕後操作的。
顯示了WatchKit app和WatchKit extension間的通訊。
管理情境:介面控制器
每個情境是由一個介面控制器對象來管理的, 它是WKInterfaceController類的執行個體。由於一次只在螢幕上顯示一個介面,app展現新介面時會根據使用者操作切換介面控制器。App可以模態介面。切換的類型也決定了介面如何展示。
注意:Glance和自訂通知介面使用特殊的介面控制器,它們和其他介面不同。
WatchKit App生命週期
使用者的操作啟動了app也決定了它的生命週期。使用者從主屏啟動app,查看glance或者查看通知介面。每個互動都會啟動WatchKit app和對應的WatchKit extension。Watch app和WatchKit會一直傳遞資訊指導使用者停止操作app,這個時候iOS掛起estension知道下次使用者操作。
在啟動時,WatchKit為當前操作載入合適的情境。如果使用者查看app的glance,WatchKit從storyboard中載入glance情境。如果使用者直接啟動app,WatchKit載入app的初始化情境。載入情境後,WatchKit通知WatchKit extension建立對應的介面控制器用來準備要展示的情境。展示了這個過程。
使用介面控制器的init和awakeWithContext:方法來載入需要的資料,設定對象的值,以及介面展示的準備工作。不要使用willActivate來初始化介面。willActivate方法只在將要顯示的很短時間內調用,所以只能用這個方法做微笑的改變。比如,用這個方法來開始動畫,或者開始只有介面顯示時才執行的操作。
介面在螢幕上時,使用者介面的操作會又介面控制器的自訂方法處理。當使用者動作表格,按鈕,開關等控制項時,WatchKit會調用你的方法來響應。使用這些方法來更新介面以及執行相關的人物。如果要在其他時間執行任務,可以使用NSTimer來實現。
注意:Glance介面不支援事件方法。點擊glance介面會啟動app。
在使用者操作Apple Watch時WatchKit extension會一直運行。Apple Watch的操作一般比較簡短,所有介面控制器應該輕量並且不要執行長時間的任務。當使用者退出app或者停止Apple Watch操作,iOS會停止介面控制器並且掛起WatchKit extension。如
App不同狀態執行的不同任務
在app聲明周期的不同狀態,iOS會調用WKInterfaceController對象的方法來讓它處理。下面的表格列出了基本上要實現的方法,以及他們是做什麼的。
| 方法 |
執行的任務 |
| init |
第一個初始化的機會 |
| awakeWithContexxt: |
使用任何可用的資料配置介面控制器。使用它來載入資料,更新標籤,圖片,表格以及其他storyboard中的對象。context資料是配置新控制器時指定的。例如,在一個多層的介面中建立一個新介面時,會指定下一個介面要顯示的context資料。建議提供context對象但是不是必須的。 |
| willActive |
介面馬上就要顯示給使用者了。這個方法中做一個介面小的改變。例如,用這個方法根據新資料改變標籤內容。介面的初始化工作還是要在init和awakeWithContext:方法中做 |
| didDeactivate |
使用這個方法來清理介面以及讓介面進入靜止狀態。例如,使用這個方法來停止計時器以及停止動畫。不能在這個方法中給介面對象設定值。從這個時候到willActivate調用之前,所有的試圖改變介面值的方法都被無視了。 |
在模擬器上調試狀態的代碼
在測試中,可以鎖定和解鎖模擬器來確認activation喝deactivation代碼是否按預期的工作。當使用Hardware>Lock命令來鎖定模擬器,WatchKit會調用當前介面的didDeactivate方法。解鎖模擬器的時候,WatchKit會調用willActivate。
和已有iOS app共用資料
如果iOS app和WatchKit extension依賴同樣的資料,使用共用的app group來儲存資料。App group是安全執行緒的。由於WatchKit extension和iOS app在不同的沙箱環境中,因此他們不能直接共用檔案以及通訊。App group讓兩個進程可以共用檔案和資料。
在iOS app和WatchKit extension工程的Capabilities tab中設定一個共用的app group。為每個target添加一個entitilements檔案,向檔案中添加一個com.apple.security.application-groups元素。所有的target需要選擇同一個app group。
在運行時,通過讀寫共用的檔案夾來共用資料。使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier:方法來擷取檔案夾根地址。使用這個URL來枚舉檔案夾內容或者建立新的檔案。
也可以用group id建立一個NSUserDefaults對象來共用資料。使用initWithSuiteName:方法建立的NSUserDefaults對象可以訪問共用資料。iOS app和WatchKit extension都可以讀寫資料。
直接和iOS app通訊
app可以使用openParentAllication:reply:方法來向iOS app發送請求和接收響應。WatchKit extension不支援後台運行模式。他們只在使用者操作Apple Watch時運行。iOS app沒有那麼多限制,他們可以被配置為在後台運行來為WatchKit extension擷取資料。有些活動可能需要一些時間才能完成,比如擷取使用者的位置,應該由iOS app來完成然後把資料傳給WatchKit extension。
當調用openParentApplication:reply:方法時,iOS在後台啟動或喚醒app然後調用app delegate的application:handleWatchKitEctensionRequest:reply:方法。App delegate通過提供的資訊執行操作然後把結果返回給WatchKit extension。
Apple Watch 開發介紹(一)WatchKit App 架構