iOS項目添加WatchKit App模塊實踐

最近在公司原來一個項目里增加了Apple Watch模塊,遇到了很多坑。首先說明,本人目前對Swift還不深入熟悉,所以還是打算在原項目里用OC來實現。其次,我用了Apple Watch3個月了,還是第一次入門,看了喵神的教程,一步步來的。想想WatchOS 都2了,再不用用都老了。

下面簡單說一下這個過程:

0、前言

如果在這之前,你沒有看過或了解WatchKit相關內容,那么建議你讀喵神的兩篇文章Apple WatchKit 初探WWDC15 Session筆記 - 30 分鐘開發一個簡單的 watchOS 2 app

一、增加watchOS

這個步驟就看圖帶過吧,對于還不知道的新手來說,看圖最直接:

  • 1.新建Target


    New Target
  • 2.選擇 watchOS


    Watchk it App
  • 3.這步驟注意,默認勾選了Notification Scene,要解釋一下:

  • <1> Glance Scene :** 如果勾選,就會在Interface.storyboard里默認生成GlanceController的界面,如果原來選中了,后來想不要,就直接在Interface.storyboard里把GlanceController界面刪除就可以了。**

  • <2> Complication : 這個就是在系統表盤顯示時,滾動 Digital Crown 時,進行一些操作,現在OS2里增加的時間旅行,就是滾動 Digital Crown時,天氣和日程表計劃跟著變動,這個功能還是有點用的。

    配置

  • 4.點擊激活吧


    Activate
  • 5.最后在原來項目里增加了這兩個目錄App和Extension。


    Watch目錄

二、一些坑要填

1.默認新建的Target版本都是1.0,所以你要改成跟你現在項目的版本一樣才行,不然就會報錯。App和Extension的Target版本都要改。


Info.plist報錯
更改為項目對應的版本號

2.默認App和Extension的Valid Architectures都是“armv7 armv7s i386 arm64”WatchOS運行的框架要改為armv7k。如果要在模擬器運行,增加i386。

No architectures to compile for armv7k

App和Extension都要改成armv7k

還有一些其實的小問題,不太記得了,相信大家如果遇到自行搜索就能解決。

三、一些代碼

Watch顯示的界面全部由Interface.storyboard里的界面生成,邏輯就是在Extension里寫,具體也沒什么好寫的,由于我是用OC寫的,連圖片緩存的都不會,參考了喵神原OS1文章:

在 Extension 的 target 中獲得圖片 (比如從網絡下載或者代碼動態生成等),并且需要重復使用的話,最好用 WKInterfaceDevice 的 -addCachedImage:name: 方法將其緩存到手表中。這樣,當我們之后再使用這張圖片的時候就可以直接通過 -setImageNamed: 來快速地從手表上生成并使用了。每個 app 的 cache 的尺寸大約是 20M,超過的話 WatchKit 將會從最老的數據開始刪除,以騰出空間存儲新的數據。

現在OS2就出現幾個問題:

  • 1.add方法增加的是圖片的名字,如果我是從網絡下載的,名字怎么取?
  • 2.如何判斷有沒有緩存?
  • 3.OS2默認已經不會自動刪除舊的數據了?

WKInterfaceDevice類里的*cachedImages這個屬性OS2下報錯,不知道為什么?有懂的求留言。

@property (nonatomic, readonly, strong) NSDictionary<NSString*, NSNumber*> *cachedImages WK_AVAILABLE_IOS_ONLY(8.2); // name and size of cached images

在這篇文章Apple Watch應用優化的一些心得技巧總結找到一些圖片優化的方法
WatchKit用的圖片庫:Github上的WKImageCache,或者直接用KFSwiftImageLoader,或者有新的庫,暫時沒有去研究,求補充。

  • 最后提供一個WatchKit下用的NSURLSession方法,網上都是Swift寫,OC這樣寫:

    NSString *requestUrl= @"http://www.google.com";
    NSURLSession * session = [NSURLSession sharedSession];
    
    NSURLSessionDataTask * task = [session dataTaskWithURL:[NSURL URLWithString:requestUrl] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(data!=nil){// 請求成功
            NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
           
            
        }else{//請求失敗

        }  
    }];
    
    [task resume];// 調用這個方法才會去請求網絡

四、審核的一些坑

前面提到勾選 include Glance Sceneinclude Complication ,結果在實現時,沒有搞好,直接在Glance Scene里顯示一個下載鏈接的二維碼,蘋果審核員問我二維碼是干什么用的?它會變嗎?

  • Glance Scene最好要用一些有意義的數據顯示


    二維碼被拒絕
  • Complication這個,我是勾選了,第二次又被拒絕,我想說,蘋果審核能一次審核全部功能嗎????


    開啟了Complication,但沒有實現功能被拒絕
  • 取消Complication功能,就是把下圖的Data Source Class刪除,在把五個勾去掉就可以了:


    Complications Configuration

終于改了,希望審核明天通過吧!!

五、總結

關于Watch App審核,如果你選擇了某個功能,但沒有實現,那么一定會被拒絕的,大家注意一下這點,坑就來那里~

用了一個星期,了解了WatchKit的基礎功能,實現了基本的需求。其實發現,剛開始很害怕實現不了,或者說,去做時知道一定會遇到很多問題,所以不敢去碰它。作為工程師,我們需要恒心和勇氣,才能面對接下來的大數據時代,我們的知道時刻要充電,做好準備吧!

最后想吐槽一下蘋果Watch,不知道是不是只有我遇到這個問題,表盤下面掉漆,這是蘋果的技術嗎???


蘋果的logo首先掉色的,心都碎了

參考


注:本文首發于 iHTCboy's blog,如若轉載,請注明來源。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容