WatchOS 2.0分析


前言

在上一期AppleWatch開發初探裏,我們知道雖然AppleWatch是一個很優秀的產品,但是它的軟件遠沒有成熟,在AppleWatch剛剛發佈的這6個月裏,它的表現有點波瀾不驚,筆者割腎買的AppleWatch,一度只拿來當鬧鐘,這讓人很心痛。
隨着WatchOS 2的正式發佈,關注Apple Watch的廣大開發者們終於可以鬆了一口氣,WatchOS做出了足夠多的調整,讓它可以孕育更強大的應用。
下面我將從老架構的新變化和新增的特性兩方面介紹WatchOS 2。

Watch OS 2的新變化

WatchOS 2開放了更豐富的功能,在WatchOS 2上,應用架構已經有了極大的不同,App Extension不在運行在iPhone上,而是直接運行在手錶裏。如圖:
架構變化
(目前實測,AppleWatch並沒有直接連接Wifi。)
App Extension遷移到了Apple Watch上,這使應用的開發方式發生了很大改變。

網絡請求的變化

WatchOS 2隨着iOS 9 一起推出,它使用NSURLSession管理網絡請求,跟iOS 9 一樣,開發者需要配置App Transport Security(下文簡稱ATS)。

SDK的Framework變動

以前的App Extension 是運行在iPhone上的,他可以使用所有iOS SDK的Framework,現在需要改用到Watch OS SDK的Framework,大部分的Framwork還可以繼續用,但是有少數Framework不能使用了。
如果你的應用用了CloudKit,或者與iOS App共享了數據,那就必須要遷移了。
可用的Framework可查看此文檔

Extension Delegate

在WatchOS 1上,App Extension使用第一個InterfaceController管理應用的生命週期和處理通知task。而在WatchOS 2上,WatchKit引入了WKExtensionDelegate協議來處理這些,它相當於iOS App的AppDelegate。

  • Watch app 的生命週期
    Watch app 的生命週期

如果已有的應用沒有在info.plist上指定WKExtensionDelegate,則App Extension依然會運行在iPhone上,不能享受WatchOS 2的種種便利。

與IOS App通信


  1. 資源共享的方式分享數據不再適用。
  2. 通過DarwinNotification實現的跨進程通信不再適用。
  3. 在之前Apple提供了openParentApplication()進行通信,現在使用Watch Connectivity framework進行替代。

( That framework provides bidirectional communications between the two processes and lets you transfer data and files in the foreground or background. )
在IOS和App Extension分別在應用啓動時爲WCSession設置WCSessionDelegate,可以判斷連接狀態,進行更靈活的數據傳輸,傳輸可以在應用前臺或者是在後臺進行,傳輸的數據可以支持String、NSData、File等類型。

數據管理

現在不能在iOS App與 App Extension上共享數據,也不能使用CloudKit來管理了,應用管理數據的方式需要保存在Watch上,如果要用到iCloud管理數據,使用Watch Connectivity與手機進行數據交互,在iOS App上使用CloudKit。另外,在新的Extension裏不能使用像GPS定位的API,想要利用它,通過iOS App定位,Watch Connectivity交互的方式變通實現。

新增的特性

WatchOS 2上,WatchKit開放了更多的功能,對音視頻媒體的支持,讓Watch App的娛樂性能有了極大的提升,能適應更多的應用場景。下面是新增的特性:

視頻播放

視頻播放通過presentMediaPlayerControllerWithURL()API進行播放,或者通過WKInterfaceMovie控件進行播放,不過它們的播放方式最終都是present一個新的InterfaceController進行的。
值得注意的一點是:傳入的URL既可以是本地資源也可以是線上資源,如果是線上資源,那麼不管你的App Extension 的info.plist是否關閉了ATS,你的資源都應該使用符合ATS的https協議。筆者猜測可能是因爲present了一個系統的WatchApp,不沿用開發者的設置。

Apple並沒有格式進行限制,但建議的格式如下:

音頻應該以 32 kbps 速率進行編碼。
視頻碼率爲 140-160 kbps 的範圍。
視頻分辨率應該是 272 x 340。
媒體文件應相對較短。例如,避免超過 30 秒。

音頻錄製

現在新的WatchOS 支持音頻錄製,通過presentAudioRecorderControllerWithOutputURL()API實現,它只支持.wav, .mp4,.m4a三種格式。

音頻播放

藉助藍牙設備,Watch App可以控制播放音樂,這需要爲Watch App指定UIBackgroundModes,並且設置shared group container使音樂文件可以同時被Watch App 和 App Extension。
請參考這篇文檔Playing Extended Audio Content 以及Making Media Files Accessible to Your Watch App兩章節。

Complication

Complication即錶盤小部件,可以顯示像電量啦、天氣啦等等,以前是不允許定製的,現在可以自定義了。

  • Complication錶盤小部件
    Complication錶盤小部件

自定義的數據通過CLKComplicationDataSource協議定義,開發者可以對各式錶盤的部件進行適配,爲TimeTravel(時間旅行)進行支持。Complication的入口同樣要在info.plist指定。
對於Complication的開發,這裏有一篇文章可以參考:
WWDC15 Session筆記 - 30 分鐘開發一個簡單的 watchOS 2 app

openSystemURL

通過WKExtension.openSystemURL()可以實現發短信打電話的功能,也可以用它來打開PassBook的url,它沒有iOS裏那麼靈活,只有有限的功能。

使用鑰匙鏈存儲安全敏感的信息

通過kSecAttrAccessibleWhenUnlocked存儲進鑰匙鏈的信息,可以保證Apple Watch不戴在用戶手上時,應用無法讀取數據,這方便了靈活的佈置頁面。

let secret = "SomeSecretInformation"
if let secretData = secret.dataUsingEncoding(NSUnicodeStringEncoding) {
    let attributes: [NSString: NSObject] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked,
        kSecAttrService: "myservice",
        kSecAttrAccount: "account name",
        kSecValueData: secretData ]
    SecItemAdd(attributes, nil)
}

其他

增加了picker控件,效果類似於iOS上的PickerView。增加了Alert和ActionSheet的API。

總結

WatchOS 2對於WatchOS 1的改進的兩部分:第一部分應用架構的變化——把Watch App Extension挪移到AppleWatch上,這引發了一些數據使用和共享的問題,Watch Connectivity框架被引入解決這個問題;第二部分新特性,WatchOS 1少的可憐的API爲人詬病,現在開放了更多的特性,特別是音頻視頻的支持,使Watch App能做的事更多。可以預見,隨着它的發佈,AppleWatch上的應用會迎來一波質的飛越。

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