這是WatchKitStoryboard攻略的第三篇,重點(diǎn)自然是Notification(通知)視圖這一部分的內(nèi)容。
首先轉(zhuǎn)述一下有關(guān)概念及原理:AppleWatch應(yīng)用的通知內(nèi)容是與iPhone應(yīng)用同步顯示的,但分為ShortLook(短時(shí)查看)和LongLook(長(zhǎng)時(shí)查看)兩類進(jìn)行展現(xiàn)。當(dāng)某iOS應(yīng)用的本地或遠(yuǎn)程通知抵達(dá)用戶的iPhone 后,iOS將會(huì)自行判斷顯示該通知的設(shè)備(iPhone或AppleWatch),對(duì)于發(fā)送到 AppleWatch的通知來(lái)說(shuō),系統(tǒng)首先會(huì)通過(guò)TapticEngine觸覺(jué)反饋提示用戶,如果用戶抬起手腕選擇查看通知,系統(tǒng)將會(huì)首先展示該通知的短時(shí)概覽(ShortLook),如果用戶不放下手腕暫停一會(huì)后AppleWatch切換進(jìn)入LongLook模式。而我們觀察Storyboard可知通知是分靜態(tài)和動(dòng)態(tài)兩種的,這里特別強(qiáng)調(diào)不要想當(dāng)然的認(rèn)為ShortLook就是對(duì)應(yīng)的靜態(tài)通知,ShortLook的通知目前在模擬器是無(wú)法測(cè)試的,Storyboard配置的靜態(tài)與動(dòng)態(tài)通知都是針對(duì)的LongLook通知,靜態(tài)標(biāo)簽內(nèi)容部分來(lái)自Notification payload,動(dòng)態(tài)內(nèi)容部分則來(lái)自于自定義WKUserNotificationInterfaceController類。
還要注意系統(tǒng)的限制:iOS系統(tǒng)無(wú)法定義一個(gè)AppleWatch專用的通知,意味著通知必然是同時(shí)發(fā)送到iPhone與AppleWatch的,只不過(guò)可以針對(duì)AppleWatch開(kāi)發(fā)專屬的動(dòng)態(tài)通知功能。
我們通過(guò)開(kāi)發(fā)一個(gè)提供AppleWatch喝水通知的簡(jiǎn)單示例應(yīng)用來(lái)看看WatchKit提供的Notification有哪些功能。
(教程運(yùn)行環(huán)境:MacOSX10.10、Xcode6.2beta3、Swift)
1.工程配置
建立testNoti項(xiàng)目,新添加WatchKit App的target。
復(fù)制一份Watch主應(yīng)用的Scheme以建立Notification模板的啟動(dòng)Scheme。
修改啟動(dòng)點(diǎn)。
看一下WatchKit App的Inteface.storyboard:Static Notification InterfaceController Scene對(duì)應(yīng)的是靜態(tài)通知,Notification ControllerScene對(duì)應(yīng)的是動(dòng)態(tài)通知。
2.靜態(tài)通知配置
我們可以看到靜態(tài)通知的CustomClass是無(wú)法指定的,其主要界面實(shí)現(xiàn)都通過(guò)配置Storyboard里相關(guān)屬性完成。我們對(duì)照Main類的Storyboard配置,可以理解為Notification整個(gè)模板的界面背景是一個(gè)不可見(jiàn)的Group,而且其上方有一層顯示通知來(lái)源應(yīng)用名稱及其圖標(biāo)的蒙版區(qū)域。
與Group組件一樣,我們可以設(shè)置整個(gè)通知的背景圖。
假設(shè)我們的通知界面設(shè)計(jì)為一個(gè)全屏帶提醒文字的藍(lán)色圖片背景,首先針對(duì)42mm設(shè)備,做一個(gè)312*352的藍(lán)色圓角矩形底圖(高度減去了標(biāo)題欄部分)并添加文字圖案,然后設(shè)置一下Background的文件名,模式改為Aspect Fill:
下圖是運(yùn)行效果,同時(shí)我們也在圖上標(biāo)注出各項(xiàng)目的對(duì)應(yīng)設(shè)置路徑。但這樣顯示不全,還達(dá)不到期望的全屏顯示的強(qiáng)調(diào)效果。
那是因?yàn)橥ㄖ獦?biāo)簽高度小了,我們加一個(gè)固定高度(這里我們針對(duì)42mm設(shè)備設(shè)置為138)的Group并把Label拖進(jìn)去,效果已經(jīng)可以看得到:
接下來(lái)設(shè)置一下圖標(biāo),我們簡(jiǎn)單的做一個(gè)寬高88px的作為42mm設(shè)備的圖標(biāo),縮小為80px作為38mm設(shè)備圖標(biāo),并將他們拖入AppIcon對(duì)應(yīng)項(xiàng)
然后是自定義的按鈕和通知文本,我們修改WatchKit Extension里的PushNotificationPayload.apns文件中對(duì)應(yīng)內(nèi)容以測(cè)試效果:
運(yùn)行發(fā)現(xiàn)期望的全屏效果已經(jīng)有了,但按鈕需要滾動(dòng)屏幕才能看到
而點(diǎn)擊“Ok I did it”按鈕會(huì)切換進(jìn)入AppleWatch應(yīng)用的主程序,Dismiss按鈕則是系統(tǒng)自動(dòng)生成的。
BTW:程序名稱部分的半透明蒙版色彩可以通過(guò)修改Notification入口的SashColor屬性進(jìn)行修改。
3.動(dòng)態(tài)通知配置
動(dòng)態(tài)通知在Storyboard部分與靜態(tài)通知配置方法類似,但我們獲得了代碼綁定通知界面元素的功能,可以后臺(tái)動(dòng)態(tài)獲取并將其在界面上進(jìn)行展現(xiàn)。
先測(cè)試一下,拖拽一個(gè)Label到動(dòng)態(tài)通知控制器上,更改文本為hi:
要將模擬器切換為顯示動(dòng)態(tài)通知,必須把Controller代碼里這段注釋取消:
overridefunc didReceiveRemoteNotification(remoteNotification: [NSObject : AnyObject], withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) { completionHandler(.Custom) }運(yùn)行一下,確實(shí)可以顯示出標(biāo)簽hi了,下面代碼綁定此Label控件,
@IBOutletweakvar dynamicLabel: WKInterfaceLabel!再添加進(jìn)一步顯示喝水量的代碼
overridefunc didReceiveRemoteNotification(remoteNotification: [NSObject : AnyObject], withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) { let mount=1.2 //此值根據(jù)你的應(yīng)用計(jì)算生成 dynamicLabel.setText("Today you should drink \(mount)L water more.") completionHandler(.Custom) }
最后別忘了在Storyboard里修改dynamicLabel的Lines為3行,以免顯示不下
運(yùn)行即可看到正確的效果。