WatchOS 2 開(kāi)發(fā)全過(guò)程
磕磕絆絆纹蝴,終于把Watch更新了庄萎,放張最有代表性的界面吧。還是會(huì)按照實(shí)際操作的順序來(lái)寫這篇文字塘安。
1.創(chuàng)建WatchKit模塊
試著運(yùn)行一下惨恭,在這里程序可能會(huì)報(bào)錯(cuò),原因是系統(tǒng)創(chuàng)建Watch Target的時(shí)候耙旦,Version版本號(hào)默認(rèn)給的都是1.0脱羡,所以可能會(huì)與原程序發(fā)生一些沖突,改過(guò)來(lái)就OK了免都。
2.實(shí)現(xiàn)App端與Watch端的通信
在WatchOS 2中下面這對(duì)方法已經(jīng)被干掉了
BOOL sendSuccess = [WKInterfaceController openParentApplication:[request dictionaryValue] reply:^(NSDictionary *replyInfo, NSError *error) {
if (!block) {
return;
}}
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{}
不過(guò)不用擔(dān)心锉罐,在新版本中蘋果添加了WatchConnectivity.framework,其中主要用到的是WCSession這個(gè)類,這里面細(xì)化了多個(gè)方法绕娘,可以根據(jù)實(shí)際需要選擇相對(duì)應(yīng)的方法脓规。具體的方法就不列出來(lái)了,在實(shí)際編碼中用到了下面這個(gè)兩個(gè)方法险领,第一個(gè)用來(lái)傳簡(jiǎn)單的數(shù)據(jù)信息和圖片侨舆,第二個(gè)用來(lái)傳音頻文件。
[[ConnectManager sharedManager].session sendMessage:[request dictionaryValue]
replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
} errorHandler:^(NSError * _Nonnull error) {
}];
[[ConnectManager sharedManager].session transferFile:url metadata:dic];
});
相對(duì)應(yīng)的代理方法:
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler
- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file
在使用上面這兩個(gè)方法時(shí)绢陌,需要注意幾點(diǎn):
1.sendMessage只支持標(biāo)準(zhǔn)數(shù)據(jù)類型
2.一開(kāi)始我打算將音頻也用sendMessage方法傳輸挨下,然后程序會(huì)拋出錯(cuò)誤,意思是傳輸?shù)膬?nèi)容過(guò)大脐湾,無(wú)法傳輸臭笆,使用sendMessageData同樣會(huì)拋出這個(gè)錯(cuò)誤。
3.當(dāng)我的某個(gè)NSString類型的參數(shù)為空時(shí)秤掌,傳輸也會(huì)失敗愁铺,這個(gè)問(wèn)題坑了我半天
4.使用Watch錄制音頻涉及到App Groups方面的內(nèi)容,考慮到都寫到一篇文章里篇幅較大闻鉴,所以我會(huì)單開(kāi)一篇茵乱,包括音頻格式的轉(zhuǎn)換等。文章鏈接如下:
Watch音頻錄制孟岛,.wav轉(zhuǎn)換.mp3瓶竭,獲取音頻文件時(shí)長(zhǎng)
關(guān)于WCSession的使用,可以看看這篇文章
stackoverflow-WCSession
3.Glance頁(yè)面實(shí)現(xiàn)與交互
蘋果將整塊Glance頁(yè)面分為Upper和Lower兩部分蚀苛,如下圖所示在验。最好讓設(shè)計(jì)了解到這一點(diǎn)玷氏,因?yàn)樵谶@個(gè)界面上的布局不是隨心所欲的堵未,而且蘋果也不建議在這個(gè)頁(yè)面放Table之類的控件,另外就是Glance沒(méi)有交互響應(yīng)盏触,點(diǎn)擊任何位置都會(huì)跳轉(zhuǎn)到應(yīng)用內(nèi)部渗蟹。
如果想通知App是從Glance頁(yè)面進(jìn)入块饺,或者想要傳入一些其他信息,可以調(diào)用下面的方法雌芽。
[self updateUserActivity:@"com.seven.watch.glance" userInfo:info webpageURL:nil];
然后在相應(yīng)的WKInterfaceController中接收
- (void)handleUserActivity:(NSDictionary *)userInfo
{}
基本的數(shù)據(jù)通信差不多就都實(shí)現(xiàn)了授艰,可能寫的不是很細(xì)致,如果有什么問(wèn)題可以留言世落,大家一起探討淮腾。