目錄:
- 前言
- 一、Apple Watch簡介
- 二、Watch App在項目中的結(jié)構(gòu)
- 三、 Apple Watch上的app特點和原理
- 四、 Watch App UI介紹
- 五、App Watch與iphone 之間的通信
- 六、Watch App 和watchKit Extention之間數(shù)據(jù)共享
- 七、Watch App通知
- 八、App Watch單獨發(fā)送網(wǎng)絡(luò)請求
前言:
隨著現(xiàn)在 Apple 生態(tài)圈的發(fā)展,越來越多的 App 會把自己的簡化版從 iOS 遷移至 WatchOS(支付寶、微信、手Q、頭條、QQ音樂、網(wǎng)易云音樂等等,都有Watch版App)。
一、Apple Watch簡介
Apple Watch是蘋果公司主打 “健康” 概念的智能手表。
于2014年發(fā)布第一代Apple Watch 1,截至2020年,已發(fā)布Apple Watch 5。
2015年3月10日,蘋果在舊金山Moscone Center召開2015年春季新品發(fā)布會,正式發(fā)布了Apple WATCH,分為運動、標準、定制三版,將于2015年4月10號預(yù)售,4月24日上市。
Apple Watch支持電話,語音回短信,連接汽車,天氣、航班信息,地圖導(dǎo)航,播放音樂,測量心跳、計步等幾十 種功能,是一款全方位的健康和運動追蹤設(shè)備。
Apple Watch App分為兩種:
-
Watch App for iOS App:
從iOS遷移過來的Watch App,可與iOS App通信。 -
Watch App:
獨立的Watch App,可獨立安裝在Apple Watch上。
大部分是第一種,Watch App for iOS App。
二、Watch App在項目中的結(jié)構(gòu)
新建一個watchOS的target。

- 這時,會出現(xiàn)兩個target:WatchKit App、WatchKit Extension。

注意:在 WatchOS 中,無法像 iOS 那樣依賴 UIKit 寫出各種復(fù)雜的界面。目前,只能依賴 storyboard 搭建出一些簡單的UI界面與界面跳轉(zhuǎn)邏輯。
三、 Apple Watch上的app特點和原理
我們從開發(fā)的角度說下Apple Watch上的app特點和原理。
Apple Watch運行模式
首先手表上app和iPhone上app是一種聯(lián)動關(guān)系,即Apple Watch上的開發(fā)的app是離不開iPhone的。為什么呢,這個它的運行策略有關(guān),手表的cpu、硬件、電量都是有限的,所以節(jié)約空間和電量是很重要的,所以手表界面設(shè)計要精簡,操作比較少。
Watch app和iPhoneapp是無縫關(guān)聯(lián)的,因為Watch上的app都是iPhone幫它運行的,手機和Watch離得近,靠無限傳輸,在一定程度上節(jié)省了Watch的很多工作量,Watch負責(zé)顯示iPhone處理后的結(jié)果,這其實也是一種綁定銷售策略。Watch上的app其實就是iPhone上app的一部分、一種擴展。
Apple Watch app界面類型

Watch app有三種和用戶交互的方式,或者說Watch app有三種界面:
- 常規(guī)Watch app,這個是必須的,一些簡單內(nèi)容的顯示和簡單操作,可以看成手機上的精簡版;
- glance類型的界面,是一種純提示型的界面,是不能和用戶互動的,這部分可有可無;
- notification類型的界面,這是消息通知時用到的,手機也可以接收推送通過這種界面顯示,這種是可以和用戶互動的。
Watch app和iPhone app的關(guān)系

Watch app和iPhone app是一種聯(lián)動關(guān)系,其實也是一個綁定關(guān)系,是一個整體,Watch app并不是一個單獨的project,而是在iOS project上擴展的一個Target,Watch app上并沒有代碼,只有界面資源,代碼是在iPhone上運行的。
在WatchOS 2 之前, WatchKit App負責(zé)展示,安裝在Watch上,WatchKit Extension負責(zé)業(yè)務(wù)和控制邏輯,安裝在iPhone上。所有運算、邏輯以及控制都是在iPhone上完成。Watch app和iPhone app是通過Watchkit進行橋接的,所有的代碼執(zhí)行邏輯方面都是在iPhone上運行的,storyboard和圖片資源在Watch端顯示的,并且Watch app的安裝運行都是由iPhone控制的。
- 此外,一個iPhone每次可關(guān)聯(lián)一個Apple Watch,它們是一對一的關(guān)系。目前Apple Watch只能跟iPhone設(shè)備配對,不支持iPad。

在WatchOS 2之后,最大的改變就是將WatchKit Extension 直接從iPhone 移植到AppleWatch上。

Watch app啟動過程

上圖是Watch app加載的一個過程,可以看出Watch app的加載是依靠iPhone來進行的,啟動app,加載Watch端的storyboard和圖片等資源,然后會初始化UI,這個時候就走到iPhone端擴展里的初始化方法了,初始化完了之后就是顯示UI,UI中的觸發(fā)的動作都是去iPhone擴展里調(diào)用代碼,將執(zhí)行結(jié)果顯示到Watch上。
剛才提到的init方法顧名思義了,awakeWithContext:方法就是通過iPhone傳遞過來的信息初始化UI的,類似我們之前的viewDidLoad,willActivate就相當于之前的viewWillAppear,這樣就應(yīng)該好理解了。
Watch App 生命周期

iPhone上app都有各自的生命周期,那么Watch app的生命周期呢,從上圖我們就可以很直觀的看到,從顯示UI、用戶交互到app結(jié)束,每一步都和iPhone對應(yīng)app的擴展密切交流。
-
WKInterfaceController繼承于NSObject WKInterfaceController 相當于UIViewController 。生命周期方法分別是:
- -initWithContext: 被初始化時調(diào)用,一般在這里配置視圖元素,相當于-viewDidLoad
- -willActivate 將要呈現(xiàn)的時候調(diào)用,也可以在這個方法中進行視圖元素的設(shè)置,相當于-viewWillAppear
- -didAppear 已經(jīng)呈現(xiàn)的時候調(diào)用 , 相當于-viewDidAppear
- -willDisappear 將要消失時調(diào)用 相當于-viewWillDisappear
- -didDeactivate 呈現(xiàn)后調(diào)用,在這個方法中停用持有self的對象,如NSTimer。相當于-viewDidDisappear
-
WKInterfaceObject 及其子類
- WKInterfaceObject 相當于UIView的代理,WatchKit實際呈現(xiàn)的View對于開發(fā)者來說是不可見的,只能通過WKInterfaceObject對UI對象屬性進行設(shè)置,可以設(shè)置的屬性非常少。
- WKInterfaceButton 相當于UIButton的代理
- WKInterfaceImage 相當于UIImageView的代理
WatchKit獨立于UIKit,所有的類都繼承自NSObject,沒有完整的Response chain
四、 Watch App UI介紹
我們做UI開發(fā), 主要用的是WatchKit框架, 對比UIKit, 功能更少, 更簡潔.
Watch App 布局
- Watch App 的視圖開發(fā)不能使用代碼,必須StoryBoard, 布局方式如下 。

-
Watch App 采取的布局方式和 iOS App完全不同。不能使用 autoLayout或者坐標。只能使用相對布局。
- 水平:left center right
- 垂直:top center bottom
-
View Size可以使用三種方式設(shè)置:
- Size To Fit Content : View的大小適應(yīng)內(nèi)容的大小
- Relative To Container : 相對容器設(shè)置自身大小
- Fixed :設(shè)置固定的寬高
UI 常見控件
WKInterfaceObject - (相當于UIView)
-
WKInterfaceGroup
- 其他的WKInterfaceObject子類對象都不能重疊,只有這個類可以同其他的WKInterfaceObject對象重疊布局。
-
不能重疊如圖所示:
image.png -
可以重疊
image.png
-
- 其他的WKInterfaceObject子類對象都不能重疊,只有這個類可以同其他的WKInterfaceObject對象重疊布局。
WKInterfaceButton - (相當于UIButton)
WKInterfaceLabel - (相當于UILabel)
WKInterfaceImage - (相當于UIImageView)
WKInterfaceTable - (相當于UITableView)
WKInterfacePicker - (相當于UIPickerView)
-
WKAlertControllerStyle - (三種彈窗方式)
- alert

- actionSheet

- sideBySideButtonsAlert

- WKInterfaceMenu - (當按壓時候觸發(fā)顯示)
- Apple Watch的 Retina屏是支持 Force Touch功能的, 提供了一種新的交互方式.
- 這是一個 WatchOS獨有的類, 當頁面中配置這 Menu時, 按壓屏幕將會激活頁面中的Menu。并且顯示出Menu下的操作, 這些操作是另一個類型, WKInterfaceMenuItem。
- Menu最多可顯示四個MenuItem, 它們可以關(guān)聯(lián)各自的點擊事件。

- 其他...
導(dǎo)航開發(fā)
所有的導(dǎo)航方式都可以通過代碼或者SB的方式實現(xiàn)
-
棧導(dǎo)航方式,類似UINavigationController。觸碰左上角可返回
-
pushControllerWIthName:context: 第一個參數(shù)是Controller對應(yīng)的Identifier字符串,在SB中設(shè)置??赏ㄟ^context傳遞數(shù)據(jù)。
image.png popController
popToRootController
-
-
modal方式
-
presentControllerWithName:context:
image.png - dismissController
-
-
分頁導(dǎo)航
- 類似UIPageController。左右滑動切換
- presentControllerWithNames:contexts: 傳入 names 和 contexts數(shù)組,通過這種方式被呼出的 Controller 將以 page 導(dǎo)航方式呈現(xiàn)。
Apple Watch 和iOS的對比
- 只能用storyboard拖拽相應(yīng)控件,搭建基本UI。
- 簡單布局,默認是垂直布局。可通過嵌套Group來完成縱向布局需求。
- 界面之間的傳值,需要依賴contextForSegue方法。
- 在storyboard中設(shè)置segueIdentifier。
- 同時在下一級controller的awake(withContext context: Any?)方法接收解析context。
五、App Watch與iphone 之間的通信
在 WatchOS中有個WatchConnectivity框架是專門負責(zé) WatchOS與 iOS之間的通信的。使用Connectivity框架在 WatchKit Extension和 iOS App之間進行通信。該框架提供了兩個進程之間的雙向通信,并允許在前臺或后臺進行數(shù)據(jù)和文件的傳輸。
在數(shù)據(jù)傳輸中可以使用NSDictionary包含要發(fā)送的數(shù)據(jù)的對象,進行數(shù)據(jù)傳輸。
字典的鍵和值必須都是屬性列表類型。例如NSNumbe、NSString、NSArray、NSDictionary、Bool等基礎(chǔ)類型
如果需要包含非屬性列表類型的類型,可以將他們打包到NSdata對象中,或者在發(fā)送之前將它們寫入文件。
WCSession
WatchConnectivity框架中主要是通過WCSession類進行數(shù)據(jù)傳輸?shù)摹?/p>
在WCSession類中, 還有一些屬性是只能在 iOS App中使用的。isPaired, isWatchAppInstalled, isComplicationEnabled, remainingComplicationUserInfoTransfers, watchDirectoryURL。這些都是僅僅在 iOS App中可用的。
在激活Session之前,可需要先進行一個檢查當前 iOS設(shè)備是否支持Connectivity框架, 方法就是調(diào)用isSupported()方法。

- 在激活WatchKit Extension的Session前, 不必檢查是否支持Connectivity框架, 因為 WatchOS一定支持Connectivity框架。

- iPhone 發(fā)送消息到apple watch

- apple watch 發(fā)送消息到 iPhone

通信方式
前臺實時傳輸
- 前臺傳輸, 是實時傳輸, 消息字典傳輸和消息數(shù)據(jù)傳輸。
消息字典傳輸

后臺不定時傳輸
后臺傳輸又分為覆蓋式傳輸, 隊列式傳輸.
覆蓋式傳輸
- 后臺傳輸中覆蓋式的傳輸意味著, 當你進行數(shù)據(jù)傳輸時, 如果第一次發(fā)送的數(shù)據(jù)還沒有送出去, 在此時進行第二次數(shù)據(jù)傳遞, 將會覆蓋第一次的數(shù)據(jù)。這時數(shù)據(jù)接收方接收的數(shù)據(jù)只會有第二次的, 第一次的數(shù)據(jù)會丟失。
- 后臺傳輸中隊列式的傳輸意味著, 后一次的傳輸不會覆蓋前一次所傳輸?shù)臄?shù)據(jù)。系統(tǒng)會把所有的數(shù)據(jù)按照次序進行發(fā)送。
隊列式傳輸
- 字典傳輸,
- 文件傳輸,
- 表盤數(shù)據(jù)傳輸。
六、Watch App 和watchKit Extention之間數(shù)據(jù)共享
在運行時可以使用共享App Group在 Watch App和 WatchKit Extension之間共享媒體文件。
-
啟用app group 功能:
image.png -
設(shè)置數(shù)據(jù)到APP group中:
image.png -
從app group 獲取內(nèi)容:
image.png
七、Watch App通知
- WatchOS 3.0(對應(yīng) iOS 10.0)開始, 通知開始使用UserNotifications框架。
- apple watch 通知分為Short-Look (短視界面)和 long-look(長視界面) 兩種
Short-Look(短視界面):
Apple Watch首次收到通知時, 系統(tǒng)會顯示短視界面。short-look只是簡單的通知預(yù)覽, 并且short-look的通知界面是不能自定義。用戶繼續(xù)查看通知,則系統(tǒng)會從short-look界面快速轉(zhuǎn)換為long-lock界面。

Long-look(長視界面):
長視界面是一個可滾動的屏幕,顯示通知的內(nèi)容和任何相關(guān)的操作按鈕。如果沒有提供自定義通知界面,Apple Watch會顯示一個默認界面,其中包括應(yīng)用程序圖標、通知的標題和通知內(nèi)容。如果提供了自定義通知界面,Apple Watch會顯示自定義界面。
Long-look 通知界面分為三個區(qū)域:sash區(qū)域、content區(qū)域、bottom區(qū)域。
- sash區(qū)域: 是覆蓋式的,其中包含應(yīng)用圖標和應(yīng)用名稱。它的顏色是可以自定義的。
- content區(qū)域: 包含有關(guān)傳入通知的詳細信息, 這是主要的自定義區(qū)域。
- bottom區(qū)域: 包含關(guān)閉按鈕以及在 iOS中注冊的可操作按鈕。

自定義長視(Long-Look)
自定義長視(Long-Look)通知界面由兩個獨立的界面組成:一個是靜態(tài)的(Static),一個是動態(tài)的(Dynamic)。
靜態(tài)界面(Static Interface)是必需的,是顯示通知消息以及配置任何靜態(tài)圖像、文本的簡單方法。
動態(tài)界面(Dynamic Interface)是可選的,可提供一種在運行時自定義通知內(nèi)容顯示的方法。
-
WatchOS會除了下面幾個情況會顯示靜態(tài)界面(Static Interface),除此之外都會顯示動態(tài)界面(Dynamic Interface):
- 當動態(tài)界面不可用時
- 沒有足夠的電量來保證顯示動態(tài)界面時
-
明確告訴 WatchOS不顯示動態(tài)界面時 如下圖:
image.png
-
靜態(tài)界面的目的是在 WatchKit Extension無法及時配置動態(tài)界面的情況下能提供穩(wěn)定的界面。通知界面也會顯示在通知中心中。
創(chuàng)建靜態(tài)界面的規(guī)則:- 所有圖片都必須位于 Watch App的包中。
- 界面不得包含control、table、map或其它交互式控件。
- 界面的notificationAlertLabel必須外連接到Lable上。Label的內(nèi)容將會被設(shè)置為通知的消息
如何判斷活躍設(shè)備
- 當 iPhone處于未鎖屏的狀態(tài)時, 通知將會推送至 iPhone上。
- 當 Apple Watch沒有在用戶的手腕上, 通知將會推送至 iPhone上。
- 當 Apple Watch在用戶的手腕上, 且 iPhone處于鎖屏狀態(tài)時, 通知將會推送至 Watch上。
- 在推送遠程通知時, 如果通知推送至 Watch上后, iPhone端是可以收到通知的, 但不會有任何提醒, 甚至屏幕都不會亮起。
- 如果想在沒有佩戴 Apple Watch時對其推送, 也可以在常規(guī)設(shè)置中禁用手腕檢測選項。但需要確保 Apple Watch沒在充電器上。
八、App Watch單獨發(fā)送網(wǎng)絡(luò)請求
- APP watch 也是通過 NSUrlSession 來發(fā)送網(wǎng)絡(luò)請求的。
- 同時也支持AFN,kingfisher .. 等ios 第三方通用庫。








