你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> Apple Watch開發的幾個小問題

Apple Watch開發的幾個小問題

編輯:IOS開發基礎
Q1 如何在調試AppleWatch的時候對watch程序打斷點
  1. 在Xcode的Target選擇AppleWatch程序

  2. Watch應用啟動之後再打開iPhone模擬器中的程序,然後回到Xcode,選擇菜單裡的Debug->Attach to Process by PID or name ,填寫apple watch extension 的bundle identifier

斷點就可以生效了

Q2 WatchKit 架構變化

在 watchOS 1 做過開發的人,都應該熟悉如下這張圖:

1.png

如上圖所示,在 watchOS 1 上面做開發,Apple Watch 應用程序由兩部分構成:Watch App 和 WatchKit 擴展。

Watch App 是一個運行在 Apple Watch 中的可執行文件。它包括 storyboard 和渲染屏幕時所需的資源文件。

WatchKit 擴展則是運行在 iPhone 上的可執行文件。包括管理應用程序界面的邏輯代碼,以及處理用戶的交互操作。

那麼,在 watchOS 2 中,WatchKit 的架構發生了比較重大的變化,我們先來看看下面這張圖:

2.png

從上面的圖中,可以很明顯地看出,蘋果把原來運行在 iPhone 手機上的 WatchKit Extension 移到 Apple Watch 中了。這將直接帶來如下改變:原來只存放一些資源和 Storyboard 的 Watch App,現在程序的業務邏輯部分(也就是代碼執行部分)也被放到 Watch App 中。這樣的話,程序給用戶的體驗會更好,Watch App 的運行可以完全獨立於 iPhone 了。

Q3 watch os 1 & watch os 2 獲取網絡資源的方法

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。

Q4 Apple Watch強退App的方法

雖然apple watch的應用沒有真正意義上的後台,表冠退出應用以後就不在運行(部分自帶應用的檢測功能不會退出)了,但下一次啟動應用會很快。可是作為一名強迫症十分想關閉後台應用,於是發現一種關閉後台應用的方法:如要完全退出健身應用,

第一步:進入健身應用界面

3.png

第二步:按住(長按)側邊按鈕,出現關機/省電模式界面後松開按鈕。

4.png

第三部:不要管界面內容,再次按住(長按)側邊按鈕,大約3秒後應用被完全退出。

如果再一次打開這個應用可能會需要一點加載時間。

Q5 wkinterfacecontroller的生命周期

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]
Q6 WKInterfaceTable如何使用

首先需要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];
    }
}
Q7 三種交互方式

Apple Watch將會有三種交互方式:主屏幕下,佩戴者可以看到所有的Watch app,用戶點擊後就可以直接啟動相應app;第二種交互方式被稱做“Glance”,該界面下不含按鈕,也不可滑動,用戶只能夠進行快速閱讀,內容將只有一屏空間。開發者可以定制該界面,用戶點擊後即會啟動相應app。第三種交互方式是通知提醒的定制操作。當iPhone上的通知推送至Apple Watch上顯示後,當用戶點擊後就可以進入更詳細的信息顯示頁面,開發者可以對該界面進行定制。

5.jpg

Q8 兼容iOS6的問題

在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的博客

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved