Xcode8帶來的新特性和坑

該文章屬于劉小壯原創(chuàng),轉(zhuǎn)載請注明:劉小壯


配圖

這段時間身邊發(fā)生了很多事,工作和學習也有點靜不下心來。同事的離開,公司的變化,生活的需要.....想做的事太多,可時間就是這么點,諸多無奈啊。總之一句話,無論做什么事,靜下心來是非常重要的。

回到正題,Xcode8正式版在9月13日已經(jīng)推送給開發(fā)者下載,我也在十一回來之后,就下載了新的Xcode。下載之后就出現(xiàn)了很多編譯錯誤,之前的插件也不能用了,但是發(fā)現(xiàn)Xcode8把好多不錯的插件功能整合到自身了,感覺這點也挺不錯。

每個版本Xcode都會帶來很多新特性,Xcode8也不例外,這些新特性會給我們的開發(fā)帶來便利,也會帶來很多坑。所以今天打算寫一篇文章,詳細講一下Xcode8給我們帶來的新特性以及帶來的坑,以及我使用過程中遇到的一些問題,希望能幫助到其他朋友。


Interface Builder

隨著14年的iPhone66P出來之后,iPhone的屏幕尺寸也越來越多,屏幕適配是一個需要解決的問題,以后不一定蘋果又出什么尺寸的iPhone呢。

iPhone66P發(fā)布的同一年,蘋果推出的Xcode6中在原有的Auto layout的基礎(chǔ)上,添加了Size Classes新特性,通過這個新特性可以使用一個XIB或者SB文件,適配不同的屏幕以及iPhoneiPad兩種設(shè)備。

Xcode8中,蘋果推出了更加強大的可視化編輯工具預覽功能,可以在不運行App的情況下,預覽當前XIBSB在不同屏幕尺寸下的顯示。(這個功能我記得之前Xcode就有,只是隱藏的比較深,蘋果現(xiàn)在給拿到外面了)

選擇一個XIB文件進去,點擊下面紅框的位置,會出現(xiàn)從3.5寸~5.5寸一系列屏幕尺寸的選項。直接點擊不同屏幕尺寸,以及橫豎屏選項,切換不同的屏幕顯示。在iPad上還可以選擇是否分屏,功能非常強大。

Interface Builder

在右邊有一個Vary for Traits選項,點擊這個選項就可以同時顯示所有可選的屏幕樣式,功能和上面圖片都一樣,只是顯示上看起來比較多。

Interface Builder

還有一點,新創(chuàng)建的XIB控件尺寸,不再是之前600*600的方塊了,而是默認是6s的長方形XIB文件,看起來舒服多了。

Target中General的變化

Xcode8之前,都需要自己設(shè)置證書和描述文件。如果設(shè)置出現(xiàn)錯誤的情況下,還可以通過點擊Fix issue來修復這個錯誤。但這有個問題就在于,Fix issue選項并不是那么好用,有的時候設(shè)置是正確的這里也提示需要Fix issue

可能蘋果也意識到這個問題的存在,在Xcode8中可以通過Automatically manage signing選項,讓蘋果為我們管理證書和配置文件,設(shè)置也都是由蘋果來完成的。在Xcode8中新建項目,這個選項默認是被勾選的。

Automatically manage signing

從上面圖中可以看到,蘋果幫我們自動管理了證書和配置文件。而且在之前的項目中,如果想要設(shè)置安裝后顯示在手機上的App名字,還需要自己到Info.plist文件中,修改Display Name字段,而現(xiàn)在直接在General中就可以做修改,這個修改和Info.plist是同步的。

但是,如果我想自己管理證書和描述文件呢?只需要去掉Automatically manage signing選項。

Automatically manage signing

如果自己到Build Settings中手動設(shè)置證書和描述文件,可以發(fā)現(xiàn)Provisioning Profile選項已經(jīng)被標明為Deprecated,也就是蘋果并不推薦手動設(shè)置。

Xcode插件

升級Xcode8之后會發(fā)現(xiàn),在Xcode8中所有第三方插件都失效了,并且連之前菜單欄的插件選項也不存在了。在之前很多iOS開發(fā)者,都是通過Alcatraz來管理插件的,現(xiàn)在Alcatraz也是不可用的。但是Xcode8自身也對編譯器進行了升級,將一些比較好的插件功能加入到Xcode中,例如單行高亮顯示等。

Xcode8中支持了開發(fā)插件工程,并且為我們提供了一個插件模板,開發(fā)的插件可以上傳到App Store下載。蘋果這么做有一個原因在于,之前Xcode和插件是運行在同一個進程的,所以插件的崩潰也會導致Xcode崩潰。蘋果現(xiàn)在將插件作為一個單獨的應(yīng)用程序,分開進程運行,不會對Xcode帶來其他影響。

Xcode Source Editor Extension

Runtime Issues

在開發(fā)過程中,因為語法或明顯的代碼錯誤(例如Retain Cycle),編譯器可以發(fā)現(xiàn)并報黃色或紅色警告。但是一些因為代碼邏輯導致的錯誤,編譯器并沒有辦法找到。例如下面的這句代碼,因為代碼邏輯的問題導致兩個數(shù)組相互引用,都不能釋放。

數(shù)組循環(huán)引用

這時候可以通過Xcode8提供的Runtime Issues新特性,查找到運行過程中出現(xiàn)的問題,并通過Graph的方式將問題可視化的展現(xiàn)給開發(fā)者。

Runtime Issues

Debug Memory Graph

Xcode6中出現(xiàn)了Debug View Hierarchy新特性,可以通過其調(diào)試當前App的視圖層級,查找UI相關(guān)的bug非常方便。在Xcode8中蘋果為開發(fā)者提供了Debug Memory Graph特性,通過這個新特性,可以直接選擇一個對象,查看與其相關(guān)的內(nèi)存關(guān)系。

Debug Memory Graph

Debug Memory GraphRuntime Issues可以配合使用,通過Debug Memory Graph分析內(nèi)存關(guān)系完成后,點擊Runtime Issues可以看到已經(jīng)發(fā)現(xiàn)的內(nèi)存問題。

Swift 3

Xcode8帶來了新版本的Swift3,新版本的Swift變化較大,如果舊版的Swift項目在Xcode8上編譯可能會失敗。對此,蘋果為開發(fā)者提供了Swift遷移工具,聽說不太好用(我沒用過這個工具)。

如果不想立刻就遷移到Swift3,可以在Builder Settings中進行設(shè)置,選擇Use Legacy Swift Language Version設(shè)置為YES,就可以繼續(xù)使用舊版本的Swift2.3

Use Legacy Swift Language Version

其他更新

  1. Xcode新版字體,SF Mono Regular字體。更新Xcode之后我比較喜歡這種字體,看起來代碼非常工整。
  2. 被編輯的行高亮顯示。之前Xcode有個插件就是這個功能,Xcode8把高亮功能集成進來了,使用起來很方便。
  3. 最新版的API文檔,展示樣式發(fā)生了很大的改變。
  4. 更方便的生成文檔(就是喵神寫的VVDocumenter),在Xcode8中可以將光標放在方法上面,通過option + command + /快捷鍵生成文檔注釋。

Xcode8適配

XIB和Storeboard適配

Xcode8之前,創(chuàng)建一個XIBSB文件,都是一個600*600的方塊XIB文件。在Xcode8之后,創(chuàng)建的XIB文件默認是6s尺寸的大小。

但是Xcode8打開之前舊項目的XIBSB文件時,會彈出下面的彈框, 這時候一般直接選擇Choose Device即可。

Choose an initial device view

但是這樣有個問題,如果Xcode8打開過這個XIB文件,并選擇Choose Device之后。其他的Xcode8以下版本的編譯器,將無法再打開這個文件,會報以下錯誤:

The document “ViewController.xib” requires Xcode 8.0 or later. 
This version does not support documents saved in the Xcode 8 format. 
Open this document with Xcode 8.0 or later.

有兩種方法解決這個問題:

  1. 你同事也升級Xcode8,比較推薦這種方式,應(yīng)該迎接改變。
  2. 右擊XIBSB文件 -> Open as -> Source Code,刪除xml文件中下面一行字段。
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

編譯錯誤

升級Xcode之后,Xcode8對之前的一些修飾符和語句不兼容,會導致一些編譯錯誤。這種錯誤導致的原因很多,這里大致列幾條,各位還是根據(jù)自身遇到的情況做修改吧。

  1. 之前一些泛型相關(guān)的修飾符,nullable之類的有的會報錯。
  2. CAAnimation及其子類,設(shè)置代理屬性后,必須在@interface()遵守代理,否則報錯,等等。

權(quán)限適配

這應(yīng)該算iOS10系統(tǒng)適配的范疇,最近這兩個都在弄,所以就直接和Xcode8適配一起寫出來了。

iOS10之后需要在Info.plist中,添加新的字段獲取權(quán)限,否則在iOS10上運行會導致崩潰。下面是一些常用的字段,如果有缺少的麻煩各位評論區(qū)補充一下。

Key 權(quán)限
Privacy - Camera Usage Description 相機
Privacy - Microphone Usage Description 麥克風
Privacy - Photo Library Usage Description 相冊
Privacy - Contacts Usage Description 通訊錄
Privacy - Bluetooth Peripheral Usage Description 藍牙
Privacy - Location When In Use Usage Description 定位
Privacy - Location Always Usage Description 后臺定位
Privacy - Calendars Usage Description 日歷

參考資料:developer.apple

推送通知

蘋果的推送在之前iOS8iOS9的時候就發(fā)生過大的更新,推送功能越來越強大。在iOS10之后蘋果推出了UserNotifications框架,可以通過這個框架更好的控制推送通知,可以更新、修改鎖屏頁面的推送消息,可以添加圖片等功能。

但是在Xcode8打包時可能會出現(xiàn)一個問題,同一份代碼在用Xcode8打包后,并且不對代碼進行修改的情況下上傳App Store后,會發(fā)現(xiàn)打包后蘋果發(fā)來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對代碼做修改,否則將不能使用推送通知。

Push Notifications

這是因為在Xcode8之后,如果需要使用Push Notifications的功能,需要勾選Capabilities -> Push NotificationsYES,否則進行遠程推送就會有問題,并且會收到蘋果發(fā)來的這封郵件。

刪除系統(tǒng)log

升級Xcode8之后,在調(diào)試和運行過程中,發(fā)現(xiàn)控制臺打印了很多不認識的log,這些log是系統(tǒng)打印的,和開發(fā)者沒關(guān)系。但是這么多log看著比較亂,怎么屏蔽掉呢?

subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, 
persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, 
enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

Target -> Edit Scheme -> Run -> Arguments中,添加OS_ACTIVITY_MODE字段,并設(shè)置為Disable即可。

OS_ACTIVITY_MODE

順便提一下,這兩天在設(shè)置log選項的時候,發(fā)現(xiàn)可以通過在Arguments中設(shè)置參數(shù),打印出App加載的時長,包括整體加載時長,動態(tài)庫加載時長等。

Environment Variables中添加DYLD_PRINT_STATISTICS字段,并設(shè)置為YES,在控制臺就會打印加載時長。

控制臺打印信息

awakeFromNib報警告

老項目在Xcode8中,有些重寫awakeFromNib方法的地方,會報下面的錯誤。這是因為沒有調(diào)用super的方法導致的,還好我平時都是調(diào)用super的,我代碼目前還沒出問題。

Method possibly missing a [super awakeFromNib] call
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內(nèi)容