在Xcode的Target選擇AppleWatch程序
Watch應用啟動之後再打開iPhone模擬器中的程序,然後回到Xcode,選擇菜單裡的Debug->Attach to Process by PID or name ,填寫apple watch extension 的bundle identifier
斷點就可以生效了
在 watchOS 1 做過開發的人,都應該熟悉如下這張圖:
如上圖所示,在 watchOS 1 上面做開發,Apple Watch 應用程序由兩部分構成:Watch App 和 WatchKit 擴展。
Watch App 是一個運行在 Apple Watch 中的可執行文件。它包括 storyboard 和渲染屏幕時所需的資源文件。
WatchKit 擴展則是運行在 iPhone 上的可執行文件。包括管理應用程序界面的邏輯代碼,以及處理用戶的交互操作。
那麼,在 watchOS 2 中,WatchKit 的架構發生了比較重大的變化,我們先來看看下面這張圖:
從上面的圖中,可以很明顯地看出,蘋果把原來運行在 iPhone 手機上的 WatchKit Extension 移到 Apple Watch 中了。這將直接帶來如下改變:原來只存放一些資源和 Storyboard 的 Watch App,現在程序的業務邏輯部分(也就是代碼執行部分)也被放到 Watch App 中。這樣的話,程序給用戶的體驗會更好,Watch App 的運行可以完全獨立於 iPhone 了。
watch os 1主要是通過WKInterfaceController的
+ (BOOL)openParentApplication:(NSDictionary *)userInfo reply:(nullable void(^)(NSDictionary * replyInfo, NSError * __nullable error)) reply WK_AVAILABLE_IOS_ONLY(8.2); // launches containing iOS application on the phone. userInfo must be non-nil
方法交給iPhone去處理,當iPhone收到消息後在AppDelegate中收到回調
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {}
到這裡後交給NSURLSession或者NSURLConnection處理。
watch os 2基於watch架構變化後,可以直接由watch發起網絡請求,值得注意的是,Apple Watch 2 中還支持 WiFi,所以 Apple Watch 可以通過 WiFi,直接獲取一些網絡數據等。並且 Apple Watch 無法處理的一些業務,可以通過 WatchConnectivity 框架的WCSession,請求 iPhone 進行處理,並將結果返回給 Apple Watch。
雖然apple watch的應用沒有真正意義上的後台,表冠退出應用以後就不在運行(部分自帶應用的檢測功能不會退出)了,但下一次啟動應用會很快。可是作為一名強迫症十分想關閉後台應用,於是發現一種關閉後台應用的方法:如要完全退出健身應用,
第一步:進入健身應用界面
第二步:按住(長按)側邊按鈕,出現關機/省電模式界面後松開按鈕。
第三部:不要管界面內容,再次按住(長按)側邊按鈕,大約3秒後應用被完全退出。
如果再一次打開這個應用可能會需要一點加載時間。
watch app是Page-Based,可以左右滑動,假設有三個interfacecontroller,剛啟動的時候,它們大概是下面這樣運行
2016-05-18 18:58:48.793 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController init] 2016-05-18 18:58:48.793 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController awakeWithContext:] 2016-05-18 18:58:48.793 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController init] 2016-05-18 18:58:48.794 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController awakeWithContext:] 2016-05-18 18:58:48.794 MonkeyForWatch WatchKit Extension[13295:382024] -[SettingInterfaceController init] 2016-05-18 18:58:48.794 MonkeyForWatch WatchKit Extension[13295:382024] -[SettingInterfaceController awakeWithContext:] 2016-05-18 18:58:48.794 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController willActivate] 2016-05-18 18:58:48.794 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController didAppear] 2016-05-18 18:58:49.297 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController willActivate] 2016-05-18 18:58:49.298 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController didDeactivate]
由InterfaceController滑動到RepositoryInterfaceController之後
2016-05-18 19:01:31.941 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController willDisappear] 2016-05-18 19:01:31.941 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController willActivate] 2016-05-18 19:01:31.942 MonkeyForWatch WatchKit Extension[13295:382024] -[InterfaceController didDeactivate] 2016-05-18 19:01:31.942 MonkeyForWatch WatchKit Extension[13295:382024] -[RepositoryInterfaceController didAppear] 2016-05-18 19:01:32.445 MonkeyForWatch WatchKit Extension[13295:382024] -[SettingInterfaceController willActivate] 2016-05-18 19:01:37.710 MonkeyForWatch WatchKit Extension[13295:382024] -[SettingInterfaceController didDeactivate]
首先需要storyboard中建立表以及自定義的row,下面是初始化表視圖,SettingRow是一個NSObject對象。
- (void)initTable { [self.settingTable setNumberOfRows:2 withRowType:NSStringFromClass([SettingRow class])]; for (NSInteger i=0; i<2; i++) { SettingRow *elementRow = (SettingRow *)[self.settingTable rowControllerAtIndex:i]; [elementRow.titleLabel setText:[NSString stringWithFormat:@"%@ 設置開發語言",@(i)]]; } }
table的點擊事件則需要復寫WKInterfaceController的方法
- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex; // row selection if controller has WKInterfaceTable property { if (rowIndex==0) { [self presentControllerWithName:NSStringFromClass([LanguageListInterfaceController class]) context:nil]; } }
Apple Watch將會有三種交互方式:主屏幕下,佩戴者可以看到所有的Watch app,用戶點擊後就可以直接啟動相應app;第二種交互方式被稱做“Glance”,該界面下不含按鈕,也不可滑動,用戶只能夠進行快速閱讀,內容將只有一屏空間。開發者可以定制該界面,用戶點擊後即會啟動相應app。第三種交互方式是通知提醒的定制操作。當iPhone上的通知推送至Apple Watch上顯示後,當用戶點擊後就可以進入更詳細的信息顯示頁面,開發者可以對該界面進行定制。
在iOS6的機器上運行,我發現了一下問題,
dyld: Library not loaded: /System/Library/Frameworks/WatchKit.framework/WatchKit Referenced from: /var/mobile/Applications/xxxx/xxx.app/xxx Reason: image not found (lldb)
因為watchkit.framework 在iOS 6上是不存在的,所以才會有上面的錯誤,這時需要在build phases裡把watchkit.framework從Required(添加framework默認為此)改為optional。
iOS開發 .framework的Optional(弱引用)和Required(強引用)區別
Apple Watch三個月開發的一些收獲總結
watchOS 2
http://bbs.feng.com/read-htm-tid-9101476.html
https://developer.apple.com/library/ios/samplecode/Lister/Introduction/Intro.html
Apple Watch 編程指南(中文版)-極客學院
Apple Watch開發專題
Apple Watch 指南-github
文章轉自 coderyi的博客