成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

經(jīng)驗(yàn)介紹:Glow App 開發(fā) Apple Watch 應(yīng)用

移動(dòng)開發(fā)
之前跟兩個(gè)同事一起用業(yè)余時(shí)間給我們的 Glow App 做了 Apple Watch 的應(yīng)用。寫這篇文章來對(duì) Apple Watch 的開發(fā)做個(gè)介紹,也列出開發(fā)過程中遇到的一些坑。雖然 Watch OS 2 已經(jīng)出來,而我們是用 WatchKit 進(jìn)行的開發(fā),但很多內(nèi)容也適用于 Watch OS 2。希望這篇文章對(duì)大家有幫助。

之前跟兩個(gè)同事一起用業(yè)余時(shí)間給我們的 Glow App 做了 Apple Watch 的應(yīng)用。寫這篇文章來對(duì) Apple Watch 的開發(fā)做個(gè)介紹,也列出開發(fā)過程中遇到的一些坑。雖然 Watch OS 2 已經(jīng)出來,而我們是用 WatchKit 進(jìn)行的開發(fā),但很多內(nèi)容也適用于 Watch OS 2。希望這篇文章對(duì)大家有幫助。

Introduction

  • Design
  • WatchKit App Architecture
  • Data Communication
  • Provisioning Profiles and Entitlements
  • Tips

Design

本質(zhì)上,你可以把 Apple Watch 當(dāng)作 iPhone 的一個(gè)擴(kuò)展屏幕。你不需要掏出手機(jī)。只需要稍稍抬一下手腕,就可以獲取信息,或做一些簡(jiǎn)單的操作。實(shí)際上,在你開發(fā) Watch App 的時(shí)候,你就會(huì)發(fā)現(xiàn) Watch 的模擬器就是當(dāng)作 iPhone 模擬器的一個(gè) external display 實(shí)現(xiàn)的。

不過 Apple Watch 展現(xiàn)了全新的人機(jī)交互方式,iOS App 的設(shè)計(jì)交互準(zhǔn)則在 Watch 上并不適用。因此在設(shè)計(jì)開發(fā) Watch App 之前,有必要先理解它的交互和基本的 UI 元素。

首先說交互。除了熟悉的手勢(shì)交互,Apple Watch 提供了 3 種新的交互方式:

  • Force Touch 

    Apple Watch 的顯示屏在感知用戶點(diǎn)擊的同時(shí),也能感知壓力。通過「重按」可以顯示最多有 4 個(gè)操作的上下文菜單。

blob.png

  • The Digital Crown(數(shù)碼表冠) 

    跟傳統(tǒng)手表一樣,表冠是最常用的交互。但在 Apple Watch 上,表冠不是用來調(diào)校時(shí)間日期,或上弦。通過轉(zhuǎn)動(dòng) Digital Crown,可以在不會(huì)遮擋視線的情況下,精確地放大縮放、滾動(dòng)、或選擇數(shù)據(jù)。它作為按鈕還有返回的功能,按下返回主屏幕,按兩下回到時(shí)鐘界面。

    聽起來很美,但目前表冠的 API 還沒有開放,滾動(dòng)都是系統(tǒng)自動(dòng)幫你做的 :[

  • Side Button 

    表冠下面的一個(gè)長(zhǎng)長(zhǎng)的按鈕。按它會(huì)把你帶到 Friends 界面。在這里,你可以給你選擇好的 12 個(gè)聯(lián)系人打電話,發(fā)短信,或者 Watch 提供的新的交流方式,例如輕點(diǎn)他們一下,畫個(gè)涂鴉,或是發(fā)送心跳。

blob.png

恩,這也沒有開放相關(guān)的 API,考慮到它聯(lián)系人的功能,估計(jì)之后也不會(huì)開放。

Apple Watch 人機(jī)交互指北

Watchkit App Architecture

當(dāng)你新增一個(gè) Watchkit App target 的時(shí)候,你會(huì)發(fā)現(xiàn) Xcode 實(shí)際上給添加了 2 個(gè)新的 executables,并同你的 iOS App 打包在一起編譯。

blob.png

他們之間的依賴關(guān)系如下圖所示,Watch App 依賴于 Watchkit Extension,而 Watchkit Extension 依賴于 iOS App. 從上面下面兩張圖都可以看到,Watch App 里只有 Storyboard 和 ImageAssets。沒錯(cuò),Watch OS 1 里,Watch App 只包含一些靜態(tài)的東西,Extension 是真正執(zhí)行代碼的地方。Extension 負(fù)責(zé)從 iOS App 那里獲得數(shù)據(jù),并控制 Watch App 界面上要顯示什么。而 Watch App 的操作也是由 Extension 向 iOS App 發(fā)起請(qǐng)求。Watch App 不直接與 iOS App 交流。

blob.png

Watch App 的每一個(gè)頁面,都需要有一個(gè)對(duì)應(yīng)的 WKInterfaceController 的子類。如上圖 Extension 的文件夾的 InterfaceController 和 GlanceInterfaceController。WKInterfaceController 除了 init 之外,還有 3 個(gè)與生命周期有關(guān)的方法:

 
  1. // 在 init 之后被調(diào)用,可以在這個(gè)方法里配置界面上的元素 
  2. - (void)awakeWithContext:(id)context; 
  3. // 當(dāng)這個(gè)頁面將要顯示給用戶的時(shí)候被調(diào)用 
  4. - (void)willActivate; 
  5. // 當(dāng)這個(gè)頁面不再顯示的時(shí)候被調(diào)用 
  6. - (void)didDeactivate; 

Data Communication

前面說到 Watch App 本身只包含一些靜態(tài)內(nèi)容,它自己不保存數(shù)據(jù),也無法發(fā)送網(wǎng)絡(luò)請(qǐng)求。它只能借由 Extension 與 iOS App 交互。所以 Watch App 與 iOS App 的數(shù)據(jù)傳遞是關(guān)鍵,也是大部分 Watch App 的主要開發(fā)工作。數(shù)據(jù)傳遞的方法主要有下面 5 種。***種是使用 WKInterfaceController 提供的 openParentApplication:reply,然后在 iOS 端 實(shí)現(xiàn) application:handleWatchKitExtensionRequest:reply 來處理 Watch Extension 發(fā)來的請(qǐng)求。***一種 Wormhole 是第三方的一個(gè)庫,通過 Dawrin notification center 發(fā)送消息并捎帶上數(shù)據(jù)。而中間三種都是通過 App Group,在獨(dú)立的共享沙盒里傳遞數(shù)據(jù)。

  • WKInterfaceController openParentApplication:reply
  • NSUserDefaults
  • Core Data
  • NSFileManager
  • Dawrin notification center - MMWormhole

WKInterfaceController openParentApplication:reply

這種方法很直觀,也是幾種數(shù)據(jù)傳遞方式中最實(shí)時(shí)可靠的。你可以用 Enum 定義幾種請(qǐng)求的類型,然后在發(fā)送請(qǐng)求的時(shí)候把請(qǐng)求類型一并傳過去,這樣 iOS App 收到請(qǐng)求時(shí),就能知道要做什么。iOS App 用 reply 回調(diào)把請(qǐng)求結(jié)果傳回去。

用這種方法,iOS App 即使在后臺(tái)也能被喚起。但 iOS App 不能主動(dòng)去喚起 Watch Extension。

 

 

  1. NSDictionary *request = @{kRequestType: @(requestType)}; 
  2. [InterfaceController openParentApplication:request 
  3.                     reply:^(NSDictionary *replyInfo, NSError *error) { 
  4. }]; 

 

  1. - (void)application:(UIApplication *)application  
  2. handleWatchKitExtensionRequest:(NSDictionary *)userInfo   
  3.                          reply:(void (^)(NSDictionary *))reply 
  4.     RequestType requestType = userInfo[kRequestType]; 
  5.     if (requestType == RequestTypeRefreshWatchData) { 
  6.         // 
  7.     } 

中間三種方式很類似,都是把數(shù)據(jù)存在一個(gè)獨(dú)立的共享沙盒中,不同是他們的存放方式。iOS App 或者 Watch App 需要數(shù)據(jù)了,就去找沙盒里面找。就像一個(gè)秘密的信箱,只有他們倆知道這在哪兒。所以這也是異步的傳遞方式,雙方不直接打交道。具體怎么用看下面代碼吧。

NSUserDefaults

用 NSUserDefaults 最簡(jiǎn)單,但有數(shù)據(jù)大小的限制。

 
  1. NSString *appGroupName = @"group.com.yourcompnay.shared";   
  2. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:appGroupName]; 
  3. [defaults setObject:user.name forKey:@"userName"]; 

Core Data

如果你的 iOS App 已經(jīng)把 Core Data 放到共享沙盒里了,那可以考慮這種方法。

  1. NSString *appGroupName = @"group.com.yourcompnay.shared";   
  2. NSURL *storeURL = [[NSFileManager defaultManager]   
  3.     containerURLForSecurityApplicationGroupIdentifier:appGroupName]; 
  4. storeURL = [storeURL URLByAppendingPathComponent:@"glow.sqlite"]; 
  5. [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType  
  6.                                               configuration:nil  
  7.                                                         URL:storeURL  
  8.                                                         options:nil  
  9.                                                         error:&error] 

NSFileManager && NSFileCoordinator

文件讀寫必然要涉及到多線程問題,不過不用擔(dān)心,用 NSFileCoordinator 就可以了。

  1. - coordinateReadingItemAtURL:options:error:byAccessor: 
  2. - coordinateWritingItemAtURL:options:error:byAccessor: 
  3. [coordinator coordinateWritingItemAtURL:fileURL  
  4.                                 options:nil  
  5.                                   error:nil 
  6.                              byAccessor:^(NSURL* writingURL) { 
  7.    [dataToSave writeToURL:newURL atomically:true]; 
  8. }]; 

NSFilePresenter

你還可以通過實(shí)現(xiàn) NSFilePresenter 協(xié)議來監(jiān)聽文件的更改,不需要自己實(shí)現(xiàn)刷新機(jī)制就能免費(fèi)獲得實(shí)時(shí)更新。

  1. - presentedItemDidChange 

Dawrin notification - MMWormhole

***一種用起來也很方便,Watch Extension 和 iOS App 一方發(fā)送消息,一方監(jiān)聽消息。而且還有一大優(yōu)勢(shì)是,Wormhole 會(huì)保存上次傳遞的數(shù)據(jù),這樣在 Watch App 喚醒的時(shí)候,可以先使用 Wormhole 里的數(shù)據(jù),等 iOS App 傳來***的數(shù)據(jù)時(shí),再更新界面。

 
  1. // init 
  2. self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:kApplicationGroupIdentifier   
  3.                                                optionalDirectory:kWormholeDirectory]; 
  4. // iOS app 
  5. NSDictionary *message = [self makeWatchData];   
  6. [self.wormhole passMessageObject:message identifier:kWormholeWatchData]; 
  7. // WatchKit Extension 
  8. NSDictionary *message = [self.wormhole messageWithIdentifier:kWormholeWatchData];   
  9. // do something with message 
  10. [self.wormhole listenForMessageWithIdentifier:kWormholeWatchData 
  11.                                listener:^(id messageObject) { 
  12.     NSLog(@"Received data from wormhole."); 
  13. }]; 

也是我開發(fā)最初使用的方式。但在我使用的過程中,發(fā)現(xiàn)如果 iOS App 是在后臺(tái)模式,就并不能實(shí)時(shí)接收到 WatchKit Extension 發(fā)來的消息。所以***,我們選擇openParentApplication:reply 和 Wormhole 的混用。在 Watch App 喚醒時(shí),使用 Wormhole 里的數(shù)據(jù),保證 Watch App 響應(yīng)的速度,同時(shí)用 openParentApplication:reply 向 iOS 請(qǐng)求***的更新。

Provisioning Profiles and Entitlements

開發(fā)之初,最讓人頭疼的可能就是 Code Signing, Provisioning 和 entitlements 這些東西了。

每一個(gè) target 都要有自己的 App ID。所以我們一共需要有三個(gè):

  • yourAppID
  • yourAppID.watchkitextension
  • yourAppID.watchkitapp

你還需要給每個(gè) App ID 創(chuàng)建一個(gè)相關(guān)聯(lián)的 Provisioning Profile。如果你用 Xcode 自動(dòng)創(chuàng)建 Provisioning Profile,它只會(huì)給你創(chuàng)建前面兩個(gè),你需要自己去 developer center 里手動(dòng)創(chuàng)建。

另外,你還需要確保你的三個(gè) Entitlements 都是對(duì)的。Version Number、Build Number、以及 App Groups (如果使用的話) 都必須是一樣的,不然編譯就不能通過。

Tips

Debug

有時(shí)候,你會(huì)需要同時(shí) debug iOS App 和 Watch App。但 Xcode 只允許你指定一個(gè) target 運(yùn)行,你要么 debug iOS App 的代碼,要么 Watch App 的代碼。但通過 Xcode 的 Attach to Process 就能同時(shí) debug。具體步驟如下:

  • 運(yùn)行 WatchKit App
  • 在 Simulator 中打開你的 iOS App
  • 在 Xcode 的菜單欄上 Debug -> Attach to Process,選擇你的 iOS App 就能同時(shí) debug iOS 跟 WatchKit app 了。

App Icons and iTunes Connect

如果在上傳你的應(yīng)用到 iTunes Connect 的時(shí)候,遇到 Invalid Binary 的錯(cuò)誤。很大可能是因?yàn)槟愕?Watch App 的 icon 里有透明層或者 alpha 通道。一個(gè)比較方便的解決辦法是,用 Preview 打開圖片,選擇導(dǎo)出(export),然后不要勾選底部的 Alpha 選項(xiàng),確定。

End

責(zé)任編輯:倪明 來源: Glow 技術(shù)團(tuán)隊(duì)博客
相關(guān)推薦

2015-04-01 09:54:47

Apple WatchAPP

2015-01-14 11:18:01

Apple WatchiPhone伴侶應(yīng)用

2015-03-10 10:45:58

AppleWatch開發(fā)App

2015-04-01 10:04:25

Apple Watch開發(fā)應(yīng)用

2015-03-30 11:06:12

AppleWatch開發(fā)Swift

2015-01-13 09:28:40

蘋果Apple Watch專門應(yīng)用

2014-12-23 09:39:41

Apple Watch

2015-07-28 09:53:59

apple watchapp store提交教程

2015-03-20 15:12:09

Apple Watch

2023-03-09 07:38:43

ChatGPTApp Store

2015-05-12 10:31:58

Apple Watch

2015-05-12 10:59:12

Apple Watch開發(fā)應(yīng)用

2015-04-28 14:25:20

APICloud適配Apple Wat

2015-03-11 14:49:47

Apple Watch

2015-03-13 10:07:26

WatchAPP

2015-03-02 15:13:52

Apple Watch

2015-03-03 09:52:24

Apple Watch

2015-04-23 10:57:07

Apple WatchAPP

2015-03-24 10:54:04

Apple Watch

2015-03-27 16:55:59

XY
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区免费观看 | 欧美日韩在线观看一区 | 狠狠干天天干 | 天天草天天射 | 国产视频一区二区三区四区五区 | 国产专区视频 | 二区三区视频 | 亚洲iv一区二区三区 | 国产中文字幕av | 欧美性生活一区二区三区 | 欧美视频精品 | 亚洲综合在线视频 | 欧美黑人激情 | 久久99这里只有精品 | 99久久中文字幕三级久久日本 | 亚洲国产精品一区二区久久 | 国产精品久久久av | 免费一区二区三区 | 欧美一级淫片免费视频黄 | 小草久久久久久久久爱六 | 在线综合视频 | 久久伊人久久 | 久久精品亚洲欧美日韩久久 | 亚洲精品视频在线观看免费 | 中文字幕一区二区三区精彩视频 | 亚洲毛片| 九九热九九 | 精品一区国产 | 国产精品极品美女在线观看免费 | 日本黄色大片免费 | 99精品观看| 久久久久九九九女人毛片 | 91av视频在线观看 | 国产精品自产拍在线观看蜜 | 欧美日韩一卡 | 日韩欧美高清 | 国产精品美女久久久av超清 | 精品日韩电影 | 亚洲精品久久久久久一区二区 | 一区二区三区在线播放 | 亚洲天堂网站 |