2015年8月18日 星期二

Apple WatchKit 相關資料

前段時間很夯的Apple Watch因為工作上的需求最近開始詳細的了解整個運作機制,
試圖在Watch上加入合適的功能項目,為此尋找了些相關Apple Watch的資料,大致上寫個筆記心得讓自己Review一下.

首先Apple Watch在UI上分為三個部分:
1. Interface        - WatchKit Apps
2. Notification  - Receive APNS
3. Glance           - Something like Newstand



1. Interface
由App icon點擊後所呈現的畫面,基本上可以與使用者進行一些互動,例如收件/ 回覆簡易訊息, 都可以透過Watch做到, 但原則是不要在 Watch上做複雜的事情,不僅自己寫Code寫得很累, 使用者也會沒有那個耐性去使用.
在WatchKit當中並不能直接存取原本存在於iOS App的class,因此如果想要透過原本在App的Class去進行一些事情的話有兩種方式:         (1). WKInterfaceController.openParentApplication
    • 採用這個方式他會呼叫AppDelegate的handleWatchKitExtensionRequest
      如此就可以在AppDelegate當中進行操做.
      PS. 記得要將Code寫在beginBackgroundTaskWithName & endBackgroundTask之間, 不然會發現當App進入Background就不能正確Working了,別將想要做的事情寫在beginBackgroundTaskWithName的block裡面,那是例外區... 當初單字沒看清楚被騙了一陣子  哭哭.

(2). 將原本的Class在拉入WatchKit Extension當中
    • 這個作法呢, 我除了將JSON/ XML Parser弄進來之外, 其他的我都透過第一個辦法跟App做溝通,不過基於Code的乾淨與維護的方便性來想,我認為還是第一個辦法比較好. 純粹個人認為.
在Interface Controller上還有一點應該是比較重要的, 就是語音的部分.
首先在 Watch上是沒有鍵盤輸入這回事情的,因此想要做回覆的話Apple提供大約三種類型
  1. icon image
  2. animate image
  3. text 
原則上, 其實在三個都是 text, icon / animate image都是UTF-8特殊字元,text的來源分為預設字串以及語音辨識,而要使用這些東西都非常的簡單,WatchKit已經幫你把東西包好了,你只要presentController就好,以下Code部分:

let defaultMessage = [
            "已收到,將會為您處理",
            "感謝您的提問,將會盡快回覆您",
            "已收到您的請求"
        ]

self.presentTextInputControllerWithSuggestions(defaultMessage, allowedInputMode: WKTextInputMode.AllowAnimatedEmoji) { (result) -> Void in
           
}



我覺得在Interface上要注意的大約就是這樣, 其他的其實稍微看些Controller的method or Delegate大致上就可以知道怎麼去操作了.



2. Notification
在這部分其實也沒有太困難的地方, 比較有需要注意的地方在於Long look interface怎麼加入UIButton,這並不是像模擬機那樣寫在APNS上就有了, 在實機上如果要在Notification中加入Button必須要在Application當中註冊Notfication Action,並且對應好category這樣才可以,以下是官方範例Code:
  • var categories = NSMutableSet()
  • // part 1
  • var acceptAction = UIMutableUserNotificationAction()
  • acceptAction.title = NSLocalizedString("Accept", comment: "Accept invitation")
  • acceptAction.identifier = "accept"
  • acceptAction.activationMode = UIUserNotificationActivationMode.Foreground
  • acceptAction.authenticationRequired = false
  •  
  • // part 2
  • var inviteCategory = UIMutableUserNotificationCategory()
  • inviteCategory.setActions([acceptAction],
  • forContext: UIUserNotificationActionContext.Default)
  • inviteCategory.identifier = "invitation"
  • categories.addObject(inviteCategory)
  • // Configure other actions and categories and add them to the set...
  • // part 3
  • var settings = UIUserNotificationSettings(forTypes: (.Alert | .Badge | .Sound),
  • categories: categories)
  • UIApplication.sharedApplication().registerUserNotificationSettings(settings)

稍微解釋一下上面的程式碼到底在做什麼,
part 1的部分在建立宣告Button, activationMode記得要設為Foreground,因為background的handle是在AppDelegate,foreground的handle則是在WatchKit的InterfaceController.

part2的地方則是宣告這個Action是屬於哪個Category, Category是透過APNS再傳送的時候加入一個Category : "category name"來做定義,如果有定義就會呼叫相對應的Action,所以這個要設好,不然Button會跑不出來.用上述的Code來做說明,如果APNS過來的資料是:
[aps: {
    alert = "Push test.",
    badge = 1,
    category = "invitation",

}]

那就會看到Watch上出現Button,而如果APNS的資料為:
[aps: {
    alert = "Push test.",
    badge = 1,
}]
那你就算AppDelegate當中有寫以上的Code也是不會在Watch上看到Button的,因為category沒有對應到.

part 3則是完成這個設定,基本上就是那樣子不會變

以上做完就可以再WatchKit的Notification上加入Button囉!


3. Glance
誒都.... 這個沒有研究到, 基本上他算是Today Extension的延伸吧,個人感覺.





相關資料:













   

沒有留言:

張貼留言