WatchOS 2 開發(fā)全過程

磕磕絆絆,終于把Watch更新了,放張最有代表性的界面吧。還是會按照實(shí)際操作的順序來寫這篇文字。
1.創(chuàng)建WatchKit模塊

試著運(yùn)行一下,在這里程序可能會報(bào)錯(cuò),原因是系統(tǒng)創(chuàng)建Watch Target的時(shí)候,Version版本號默認(rèn)給的都是1.0,所以可能會與原程序發(fā)生一些沖突,改過來就OK了。
2.實(shí)現(xiàn)App端與Watch端的通信
在WatchOS 2中下面這對方法已經(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
{}
不過不用擔(dān)心,在新版本中蘋果添加了WatchConnectivity.framework,其中主要用到的是WCSession這個(gè)類,這里面細(xì)化了多個(gè)方法,可以根據(jù)實(shí)際需要選擇相對應(yīng)的方法。具體的方法就不列出來了,在實(shí)際編碼中用到了下面這個(gè)兩個(gè)方法,第一個(gè)用來傳簡單的數(shù)據(jù)信息和圖片,第二個(gè)用來傳音頻文件。
[[ConnectManager sharedManager].session sendMessage:[request dictionaryValue]
replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
} errorHandler:^(NSError * _Nonnull error) {
}];
[[ConnectManager sharedManager].session transferFile:url metadata:dic];
});
相對應(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.一開始我打算將音頻也用sendMessage方法傳輸,然后程序會拋出錯(cuò)誤,意思是傳輸?shù)膬?nèi)容過大,無法傳輸,使用sendMessageData同樣會拋出這個(gè)錯(cuò)誤。
3.當(dāng)我的某個(gè)NSString類型的參數(shù)為空時(shí),傳輸也會失敗,這個(gè)問題坑了我半天
4.使用Watch錄制音頻涉及到App Groups方面的內(nèi)容,考慮到都寫到一篇文章里篇幅較大,所以我會單開一篇,包括音頻格式的轉(zhuǎn)換等。文章鏈接如下:
Watch音頻錄制,.wav轉(zhuǎn)換.mp3,獲取音頻文件時(shí)長
關(guān)于WCSession的使用,可以看看這篇文章
stackoverflow-WCSession
3.Glance頁面實(shí)現(xiàn)與交互
蘋果將整塊Glance頁面分為Upper和Lower兩部分,如下圖所示。最好讓設(shè)計(jì)了解到這一點(diǎn),因?yàn)樵谶@個(gè)界面上的布局不是隨心所欲的,而且蘋果也不建議在這個(gè)頁面放Table之類的控件,另外就是Glance沒有交互響應(yīng),點(diǎn)擊任何位置都會跳轉(zhuǎn)到應(yīng)用內(nèi)部。


如果想通知App是從Glance頁面進(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ì)致,如果有什么問題可以留言,大家一起探討。