AppleWatch開發初探

目錄

Apple Watch 簡介
爲什麼要做Apple Watch App
基本概念
開始進行開發

總結


Apple Watch 簡介

2014年9月9日,蘋果2014年秋季新品發佈會在加州庫比蒂諾的Flint表演藝術中心舉行,會上蘋果公司CEO Tim Cook 對外公佈了全新的產品:Apple Watch,並於4月24日上市。
Apple Watch採用藍寶石屏幕,兩個屏幕尺寸。支持電話,語音回短信,連接汽車,天氣、航班信息,地圖導航,播放音樂,測量心跳、計步等幾十種功能,是一款全方位的健康和運動追蹤設備。

爲什麼要做Apple Watch App

得益於Apple的巨大號召力,Apple Watch是目前看來市場上唯一一款有市場前景和應用前景的智能穿戴設備,人們普遍相信Apple能精益求精,做出出色的產品,Apple也對它寄予厚望:

“No other Apple device has ever been so closely connected to the user.”

現在已有Apple Watch應用適配的App已經有很多,許多常見的App已經對它做了適配,像微信、微博、網易新聞、qq、支付寶等大衆應用,早已推出了Watch版。我司的競品中,也有提供了Watch版的廠商,落後就要捱打,我們在競爭中已經落後了一丟丟,所以有必要對它進行關注,往後推出產品。
除此之外,作爲一個iOS開發者,爲這樣一個新的設備做好適配也是很有必要的。

基本概念

Apple Watch 是一條全新的產品線,Apple引入了一些全新的概念在手錶上,下面簡略介紹一下:

  • Force Touch

    用力按壓屏幕,這會觸發當前屏幕的菜單。

  • Gestures

    分別是點按、橫劃、豎劃、側滑返回。

  • Digital Crown

    數碼錶冠可以滾動content,點按可以返回應用列表和錶盤界面,長按呼出Siri,這些都是系統管理的, 類似於Home鍵。

  • Side Button

    可以呼出Friends screen,長按會有關機選項。

  • Glance

    Glance界面可以在錶盤頁面下邊緣滑動彈出,用來顯示App的預覽信息,可以左右橫劃,每個頁面展示一個App的Glance,對應用來說,它不是必須的。

  • Notification

    分爲兩種,Short looks 和 Long looks,分別對應剛看到通知的簡短信息和停留一會的詳細信息。

  • handoff

    Apple Watch helps people quickly access information, but there are times when they may want to dive deeper into content on their iOS devices. Your Apple Watch app uses Handoff to convey information about the wearer’s current activity to their other devices.

開始進行開發

iPhone App、WatchKit Extension和Watch App 三者的關係

iOS8開始Apple推出了一個新的概念App Extension,通過App Extension,開發者可以創建像第三方鍵盤、TodayWidget的這種擴展。

這是他們之間的關係圖:
iphone_watch_communication

Apple Watch的開發用的也是這種模式,其中Watch App與WatchKit Extension的通信方式我們不用關注,WatchKit的API就是對這種通信的封裝。
在Apple Watch的開發上:

  • Watch App相當於Host app,它由WatchKit Extension控制,Watch App會安裝在手錶上,它只包含資源文件,不包含代碼。
  • WatchKit Extension是安裝在手機上的,它負責實現Watch App的邏輯,交互通過藍牙進行。
  • iPhone App是主應用,WatchKit Extension和Watch App依賴於它。

主要類

AppleWatch發佈的時間並不長,現在WatchKit暴露出來的API不多。下面是一些常見的類。

WKInterfaceController

WKInterfaceController 在 WatchKit 中類似UIKit的 UIViewController,它的生命週期方法比UIViewController少很多:
lifecircle

func awakeWithContext(context: AnyObject?)//類似viewDidLoad
func willActivate() // 類似viewDidAppear
func didDeactivate() // 類似viewDidDispear

WKInterfaceController還可以負責處理通知的action選擇事件,table的選擇事件等

func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject]) 
func handleActionWithIdentifier(identifier: String?, forLocalNotification localNotification: UILocalNotification) 
func handleUserActivity(userInfo: [NSObject : AnyObject]?) 
func table(table: WKInterfaceTable, didSelectRowAtIndex rowIndex: Int) 

除了上面幾個它還有API與iPhone App 交互

class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject], NSError?) -> Void)?) -> Bool

處理handoff的API,其中updateUserActivity()向iOS App提供handoff信息,可以在iOS應用端處理此信息。
invalidateUserActivity()通知系統handoff信息已經更改。

func updateUserActivity(type: String, userInfo: [NSObject : AnyObject]?, webpageURL: NSURL?) 
func invalidateUserActivity()

WKInterfaceObject

是UI元素的父類,Button、Label和Image這些類都是它的子類。WKInterfaceObject在功能和用法上有點像UIKit中的UIView,但是它並不是直接顯示在Watch上的View,因爲代碼的邏輯是運行在iOS上的,WKInterfaceObject只是watch app在WatchKit Extension上的代理對象。
在WatchKit 1.0它只有5個API:

func setHidden(hidden: Bool)
func setAlpha(alpha: CGFloat)
func setWidth(width: CGFloat)
func setHeight(height: CGFloat)

var interfaceProperty: String { get }

可見它不支持操作添加刪除子元素(只能用storyboard了),不如UIView靈活。

WKInterfaceTable

WKInterfaceTable相當於UIKit的UITableView,在WatchOS1.0上,AppleWatch的邏輯代碼執行在iPhone上,要以delegate方式交互數據受藍牙傳輸的限制,並不現實,要對它進行配置,只能靠初始化時調用代碼設置:

//  MyRowController.swift
import Foundation  
import WatchKit

class MyRowController: NSObject {  
    @IBOutlet weak var label: WKInterfaceLabel!
}

//  InterfaceController.swift
import WatchKit  
import Foundation

class InterfaceController: WKInterfaceController {

    let tableDataSource :[[String:String]] = [
        ["title":"title0","description":"description0"],
        ["title":"title1","description":"description1"],
        ["title":"title2","description":"description2"],
        ["title":"title3","description":"description3"],
        ["title":"title4","description":"description4"],
        ["title":"title5","description":"description5"],

    ]
    @IBOutlet weak var table: WKInterfaceTable!

    override awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context: context)

        table.setNumberOfRows(data.count, withRowType: "MyRowController")
        for (i, value) in enumerate(tableDataSource) {
            if let rowController = table.rowControllerAtIndex(i) as? MyRowController {
                rowController.info = value
            }
        }
    }
}

Menu

Context Menu是AppleWatch的獨有概念,它由ForceTouch呼出,可以在代碼裏調整它的數量和功能,有點像安卓裏的上下文菜單。

func addMenuItemWithImage(image: UIImage, title: String, action: Selector) // all parameters must be non-nil
func addMenuItemWithImageNamed(imageName: String, title: String, action: Selector)
func addMenuItemWithItemIcon(itemIcon: WKMenuItemIcon, title: String, action: Selector)
func clearAllMenuItems()

用戶文本輸入

使用 presentTextInputControllerWithSuggestions 方法實現輸入(語音轉文本)。

    func presentTextInputControllerWithSuggestions(suggestions: [AnyObject]?, allowedInputMode inputMode: WKTextInputMode, completion: ([AnyObject]!) -> Void)

與iPhone交互

Watch App 從運行機制上更像是 iOS 應用的一個 Widget,本質上跟 iPhone 鎖屏界面的“今天”(Today)沒有區別,它們的開發思路和運行模式也很接近,Today 和 Watch APP 都屬於 iOS 中 Extension 開發。

這就意味着,WatchOS的App跟iOS的App做交互很麻煩,查了一下,開發者可以使用下面幾種方式實現:
App的通信需要我們自己開發。有下面幾種方式:
Extension和iPhone


  1. 共享存儲空間
    App之間的一種通信方式是讀寫同一塊共享存儲空間,達到數據交換的目的,我們可以共享NSUserDefault或SQLite。需要注意的是Extension和iPhone App屬於不同的進程,要共享存儲空間,需要在工程對應的target中同時打開App Groups的權限,並選擇共享的組名。
  2. 直接通信
    xtension和iPhone App另外一種通信方式是Extension主動向iPhone App發起請求,進行某種操作,或者請求數據。
  3. CFNotificationCenter
    DarwinNotifyCenter是系統全局的通知,跨進程當然不在話下。

The Darwin Notify Center has no notion of per-user sessions, all notifications are system-wide.
WatchKit Extension中向iPhone App發送請求:

class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject]!, NSError!) -> Void)?) -> Bool

在iPhone App的AppDelegate中實現如下方法響應Watch App的請求:

- (void)application:(UIApplication * nonnull)application handleWatchKitExtensionRequest:(NSDictionary * nullable)userInfo reply:(void (^ nonnull)(NSDictionary * nullable replyInfo))reply;

此外,我們還可以通過openURL的方式由WatchKit Extension向iOS App發起請求。

其他

WatchKit Extension是運行在手機上的,資源如果展示在手錶上要經過藍牙傳輸,所以一般需要把資源文件放在Watch App的target裏。
因爲代碼並不直接操控Watch上的View,所以,手錶上的touch事件無法捕捉,動畫也只有幀動畫。

WatchOS 2.0

以上只適用於WatchOS 1.0,WatchOS 2.0會有一個巨大的改變:Apple開放了多個硬件的權限,Apple Watch可以連接Wifi,開發者可以調用聲音視頻,使用它上面的傳感器。

Apps now run natively for better performance.

With watchOS 2, many apps are native apps, which means they run entirely on your Apple Watch. So they load more quickly and have even greater capabilities.

Do even more with apps.

Apple Watch apps have more possibilities with watchOS 2. Apps can now take advantage of features like the Taptic Engine , Digital Crown, accelerometer, heart rate sensor, speaker, and microphone.

已有應用分析

微信

微信可以查看簡單的消息和瀏覽朋友圈,有一個很有趣的功能,它可以在手錶上向好友打招呼,好友的iPhone上會有一個定製的通知。

網易新聞

可以看新聞列表和內容,不過實際操作起來並不爽快,不如直接看手機。

家庭用藥

定時提醒用藥有點抓住了痛點,其他功能並沒什麼用,只會提示打開iOS App查看文章。

小結

現在的好應用還是太少了,這不得不感謝糟糕的API。

總結

Apple Watch發佈的時候說的很好聽,但是實際開發中的限制太多,根據我對API的分析,它爲開發者開放的東西太少了,動畫基本不可用,視頻音樂不支持,界面也不怎麼靈活,手錶當中一些炫酷的功能也沒有API,就好像傳感器和屏幕僅僅是粘在了一起,目前用處不大。雖然我們有競品早一步進入了市場,基於Apple的限制,也沒法做出很出色的產品,這也是開頭我所說的落後一丟丟的由來。Watch OS 2.0的發佈將會是一個跨越,它會帶來更加靈活強大的功能,開發者在新的平臺上能開發出有想象力的應用。

參考文獻

http://www.zhihu.com/question/29446492
https://developer.apple.com/watch/human-interface-guidelines/
http://onevcat.com/2014/11/watch-kit/

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