Xcode8帶來(lái)的新特性和坑

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


配圖

這段時(shí)間身邊發(fā)生了很多事,工作和學(xué)習(xí)也有點(diǎn)靜不下心來(lái)。同事的離開(kāi),公司的變化,生活的需要.....想做的事太多,可時(shí)間就是這么點(diǎn),諸多無(wú)奈啊??傊痪湓?huà),無(wú)論做什么事,靜下心來(lái)是非常重要的。

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

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


Interface Builder

隨著14年的iPhone66P出來(lái)之后,iPhone的屏幕尺寸也越來(lái)越多,屏幕適配是一個(gè)需要解決的問(wèn)題,以后不一定蘋(píng)果又出什么尺寸的iPhone呢。

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

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

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

Interface Builder

在右邊有一個(gè)Vary for Traits選項(xiàng),點(diǎn)擊這個(gè)選項(xiàng)就可以同時(shí)顯示所有可選的屏幕樣式,功能和上面圖片都一樣,只是顯示上看起來(lái)比較多。

Interface Builder

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

Target中General的變化

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

可能蘋(píng)果也意識(shí)到這個(gè)問(wèn)題的存在,在Xcode8中可以通過(guò)Automatically manage signing選項(xiàng),讓蘋(píng)果為我們管理證書(shū)和配置文件,設(shè)置也都是由蘋(píng)果來(lái)完成的。在Xcode8中新建項(xiàng)目,這個(gè)選項(xiàng)默認(rèn)是被勾選的。

Automatically manage signing

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

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

Automatically manage signing

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

Xcode插件

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

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

Xcode Source Editor Extension

Runtime Issues

在開(kāi)發(fā)過(guò)程中,因?yàn)檎Z(yǔ)法或明顯的代碼錯(cuò)誤(例如Retain Cycle),編譯器可以發(fā)現(xiàn)并報(bào)黃色或紅色警告。但是一些因?yàn)榇a邏輯導(dǎo)致的錯(cuò)誤,編譯器并沒(méi)有辦法找到。例如下面的這句代碼,因?yàn)榇a邏輯的問(wèn)題導(dǎo)致兩個(gè)數(shù)組相互引用,都不能釋放。

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

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

Runtime Issues

Debug Memory Graph

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

Debug Memory Graph

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

Swift 3

Xcode8帶來(lái)了新版本的Swift3,新版本的Swift變化較大,如果舊版的Swift項(xiàng)目在Xcode8上編譯可能會(huì)失敗。對(duì)此,蘋(píng)果為開(kāi)發(fā)者提供了Swift遷移工具,聽(tīng)說(shuō)不太好用(我沒(méi)用過(guò)這個(gè)工具)。

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

Use Legacy Swift Language Version

其他更新

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

Xcode8適配

XIB和Storeboard適配

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

但是Xcode8打開(kāi)之前舊項(xiàng)目的XIBSB文件時(shí),會(huì)彈出下面的彈框, 這時(shí)候一般直接選擇Choose Device即可。

Choose an initial device view

但是這樣有個(gè)問(wèn)題,如果Xcode8打開(kāi)過(guò)這個(gè)XIB文件,并選擇Choose Device之后。其他的Xcode8以下版本的編譯器,將無(wú)法再打開(kāi)這個(gè)文件,會(huì)報(bào)以下錯(cuò)誤:

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.

有兩種方法解決這個(gè)問(wèn)題:

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

編譯錯(cuò)誤

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

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

權(quán)限適配

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

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

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

參考資料:developer.apple

推送通知

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

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

Push Notifications

這是因?yàn)樵?code>Xcode8之后,如果需要使用Push Notifications的功能,需要勾選Capabilities -> Push NotificationsYES,否則進(jìn)行遠(yuǎn)程推送就會(huì)有問(wèn)題,并且會(huì)收到蘋(píng)果發(fā)來(lái)的這封郵件。

刪除系統(tǒng)log

升級(jí)Xcode8之后,在調(diào)試和運(yùn)行過(guò)程中,發(fā)現(xiàn)控制臺(tái)打印了很多不認(rèn)識(shí)的log,這些log是系統(tǒng)打印的,和開(kāi)發(fā)者沒(méi)關(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選項(xiàng)的時(shí)候,發(fā)現(xiàn)可以通過(guò)在Arguments中設(shè)置參數(shù),打印出App加載的時(shí)長(zhǎng),包括整體加載時(shí)長(zhǎng),動(dòng)態(tài)庫(kù)加載時(shí)長(zhǎng)等。

Environment Variables中添加DYLD_PRINT_STATISTICS字段,并設(shè)置為YES,在控制臺(tái)就會(huì)打印加載時(shí)長(zhǎng)。

控制臺(tái)打印信息

awakeFromNib報(bào)警告

老項(xiàng)目在Xcode8中,有些重寫(xiě)awakeFromNib方法的地方,會(huì)報(bào)下面的錯(cuò)誤。這是因?yàn)闆](méi)有調(diào)用super的方法導(dǎo)致的,還好我平時(shí)都是調(diào)用super的,我代碼目前還沒(méi)出問(wèn)題。

Method possibly missing a [super awakeFromNib] call
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,849評(píng)論 0 12
  • 詳細(xì)請(qǐng)查看轉(zhuǎn)載的簡(jiǎn)書(shū) — 劉小壯
    大榮紙閱讀 228評(píng)論 0 0
  • 這么晚還寫(xiě)這些,主要是有些東西以前沒(méi)用到,最近使用到,所以寫(xiě)下算做個(gè)記錄吧。 正文 Interface Build...
    A訫飛Flyme閱讀 1,594評(píng)論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,023評(píng)論 4 61
  • 我對(duì)十二月是很有感情的,最直接的原因是我生在這個(gè)月。小時(shí)候年少無(wú)知,遠(yuǎn)大理想,學(xué)了點(diǎn)皮毛歷史,總以為自己的生日被賦...
    嘿嘿皮卡秋閱讀 367評(píng)論 2 3

友情鏈接更多精彩內(nèi)容