Apple Watch開發(fā)-初探

目錄:

  • 前言
  • 一、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。

企業(yè)微信截圖_e1206af5-51d4-44b6-8f02-0ee72d50de39.png
  • 這時,會出現(xiàn)兩個target:WatchKit App、WatchKit Extension。
2.png

注意:在 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界面類型

image.png

Watch app有三種和用戶交互的方式,或者說Watch app有三種界面:

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

Watch app和iPhone app的關(guān)系

image.png

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。
appFramework.png

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

watchOS2.png

Watch app啟動過程

image.png

上圖是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 生命周期

image.png

iPhone上app都有各自的生命周期,那么Watch app的生命周期呢,從上圖我們就可以很直觀的看到,從顯示UI、用戶交互到app結(jié)束,每一步都和iPhone對應(yīng)app的擴展密切交流。

  • WKInterfaceController繼承于NSObject WKInterfaceController 相當于UIViewController 。生命周期方法分別是:

    1. -initWithContext: 被初始化時調(diào)用,一般在這里配置視圖元素,相當于-viewDidLoad
    2. -willActivate 將要呈現(xiàn)的時候調(diào)用,也可以在這個方法中進行視圖元素的設(shè)置,相當于-viewWillAppear
    3. -didAppear 已經(jīng)呈現(xiàn)的時候調(diào)用 , 相當于-viewDidAppear
    4. -willDisappear 將要消失時調(diào)用 相當于-viewWillDisappear
    5. -didDeactivate 呈現(xiàn)后調(diào)用,在這個方法中停用持有self的對象,如NSTimer。相當于-viewDidDisappear
  • WKInterfaceObject 及其子類

    1. WKInterfaceObject 相當于UIView的代理,WatchKit實際呈現(xiàn)的View對于開發(fā)者來說是不可見的,只能通過WKInterfaceObject對UI對象屬性進行設(shè)置,可以設(shè)置的屬性非常少。
    2. WKInterfaceButton 相當于UIButton的代理
    3. WKInterfaceImage 相當于UIImageView的代理
  • WatchKit獨立于UIKit,所有的類都繼承自NSObject,沒有完整的Response chain

四、 Watch App UI介紹

此章節(jié)會在后續(xù)的文章中介紹

我們做UI開發(fā), 主要用的是WatchKit框架, 對比UIKit, 功能更少, 更簡潔.

Watch App 布局

  • Watch App 的視圖開發(fā)不能使用代碼,必須StoryBoard, 布局方式如下 。
image.png
  • Watch App 采取的布局方式和 iOS App完全不同。不能使用 autoLayout或者坐標。只能使用相對布局。

    1. 水平:left center right
    2. 垂直:top center bottom
  • View Size可以使用三種方式設(shè)置:

    1. Size To Fit Content : View的大小適應(yīng)內(nèi)容的大小
    2. Relative To Container : 相對容器設(shè)置自身大小
    3. Fixed :設(shè)置固定的寬高

UI 常見控件

  • WKInterfaceObject - (相當于UIView)

  • WKInterfaceGroup

    • 其他的WKInterfaceObject子類對象都不能重疊,只有這個類可以同其他的WKInterfaceObject對象重疊布局。
      1. 不能重疊如圖所示:


        image.png
      2. 可以重疊


        image.png
  • WKInterfaceButton - (相當于UIButton)

  • WKInterfaceLabel - (相當于UILabel)

  • WKInterfaceImage - (相當于UIImageView)

  • WKInterfaceTable - (相當于UITableView)

  • WKInterfacePicker - (相當于UIPickerView)

  • WKAlertControllerStyle - (三種彈窗方式)

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

導(dǎo)航開發(fā)

  • 所有的導(dǎo)航方式都可以通過代碼或者SB的方式實現(xiàn)

  • 棧導(dǎo)航方式,類似UINavigationController。觸碰左上角可返回

    1. pushControllerWIthName:context: 第一個參數(shù)是Controller對應(yīng)的Identifier字符串,在SB中設(shè)置??赏ㄟ^context傳遞數(shù)據(jù)。


      image.png
    2. popController

    3. popToRootController

  • modal方式

    1. presentControllerWithName:context:


      image.png
    2. dismissController
  • 分頁導(dǎo)航

    1. 類似UIPageController。左右滑動切換
    2. 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ù)和文件的傳輸。

  1. 在數(shù)據(jù)傳輸中可以使用NSDictionary包含要發(fā)送的數(shù)據(jù)的對象,進行數(shù)據(jù)傳輸。

  2. 字典的鍵和值必須都是屬性列表類型。例如NSNumbe、NSString、NSArray、NSDictionary、Bool等基礎(chǔ)類型

  3. 如果需要包含非屬性列表類型的類型,可以將他們打包到NSdata對象中,或者在發(fā)送之前將它們寫入文件。

WCSession

  1. WatchConnectivity框架中主要是通過WCSession類進行數(shù)據(jù)傳輸?shù)摹?/p>

  2. 在WCSession類中, 還有一些屬性是只能在 iOS App中使用的。isPaired, isWatchAppInstalled, isComplicationEnabled, remainingComplicationUserInfoTransfers, watchDirectoryURL。這些都是僅僅在 iOS App中可用的。

  3. 在激活Session之前,可需要先進行一個檢查當前 iOS設(shè)備是否支持Connectivity框架, 方法就是調(diào)用isSupported()方法。

image.png
  1. 在激活WatchKit Extension的Session前, 不必檢查是否支持Connectivity框架, 因為 WatchOS一定支持Connectivity框架。
image.png
  1. iPhone 發(fā)送消息到apple watch
image.png
  1. apple watch 發(fā)送消息到 iPhone
image.png

通信方式

前臺實時傳輸

  • 前臺傳輸, 是實時傳輸, 消息字典傳輸和消息數(shù)據(jù)傳輸。
    消息字典傳輸
image.png

后臺不定時傳輸

后臺傳輸又分為覆蓋式傳輸, 隊列式傳輸.

覆蓋式傳輸
  • 后臺傳輸中覆蓋式的傳輸意味著, 當你進行數(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之間共享媒體文件。

  1. 啟用app group 功能:


    image.png
  2. 設(shè)置數(shù)據(jù)到APP group中:


    image.png
  3. 從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界面。

image.png

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中注冊的可操作按鈕。
image.png

自定義長視(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 第三方通用庫。
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容