該文章屬于劉小壯原創(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年的iPhone6
和6P
出來之后,iPhone
的屏幕尺寸也越來越多,屏幕適配是一個需要解決的問題,以后不一定蘋果又出什么尺寸的iPhone
呢。
在iPhone6
和6P
發(fā)布的同一年,蘋果推出的Xcode6
中在原有的Auto layout
的基礎(chǔ)上,添加了Size Classes
新特性,通過這個新特性可以使用一個XIB
或者SB
文件,適配不同的屏幕以及iPhone
和iPad
兩種設(shè)備。
在Xcode8
中,蘋果推出了更加強大的可視化編輯工具預覽功能,可以在不運行App
的情況下,預覽當前XIB
或SB
在不同屏幕尺寸下的顯示。(這個功能我記得之前Xcode
就有,只是隱藏的比較深,蘋果現(xiàn)在給拿到外面了)
選擇一個XIB
文件進去,點擊下面紅框的位置,會出現(xiàn)從3.5寸~5.5寸
一系列屏幕尺寸的選項。直接點擊不同屏幕尺寸,以及橫豎屏選項,切換不同的屏幕顯示。在iPad
上還可以選擇是否分屏,功能非常強大。
在右邊有一個Vary for Traits
選項,點擊這個選項就可以同時顯示所有可選的屏幕樣式,功能和上面圖片都一樣,只是顯示上看起來比較多。
還有一點,新創(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
中新建項目,這個選項默認是被勾選的。
從上面圖中可以看到,蘋果幫我們自動管理了證書和配置文件。而且在之前的項目中,如果想要設(shè)置安裝后顯示在手機上的App
名字,還需要自己到Info.plist
文件中,修改Display Name
字段,而現(xiàn)在直接在General
中就可以做修改,這個修改和Info.plist
是同步的。
但是,如果我想自己管理證書和描述文件呢?只需要去掉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
帶來其他影響。
Runtime Issues
在開發(fā)過程中,因為語法或明顯的代碼錯誤(例如Retain Cycle
),編譯器可以發(fā)現(xiàn)并報黃色或紅色警告。但是一些因為代碼邏輯導致的錯誤,編譯器并沒有辦法找到。例如下面的這句代碼,因為代碼邏輯的問題導致兩個數(shù)組相互引用,都不能釋放。
這時候可以通過Xcode8
提供的Runtime Issues
新特性,查找到運行過程中出現(xiàn)的問題,并通過Graph
的方式將問題可視化的展現(xiàn)給開發(fā)者。
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
和Runtime 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
。
其他更新
-
Xcode
新版字體,SF Mono Regular
字體。更新Xcode
之后我比較喜歡這種字體,看起來代碼非常工整。 - 被編輯的行高亮顯示。之前
Xcode
有個插件就是這個功能,Xcode8
把高亮功能集成進來了,使用起來很方便。 - 最新版的
API
文檔,展示樣式發(fā)生了很大的改變。 - 更方便的生成文檔(就是喵神寫的
VVDocumenter
),在Xcode8
中可以將光標放在方法上面,通過option + command + /
快捷鍵生成文檔注釋。
Xcode8適配
XIB和Storeboard適配
在Xcode8
之前,創(chuàng)建一個XIB
或SB
文件,都是一個600*600
的方塊XIB
文件。在Xcode8
之后,創(chuàng)建的XIB
文件默認是6s
尺寸的大小。
但是Xcode8
打開之前舊項目的XIB
或SB
文件時,會彈出下面的彈框, 這時候一般直接選擇Choose Device
即可。
但是這樣有個問題,如果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.
有兩種方法解決這個問題:
- 你同事也升級
Xcode8
,比較推薦這種方式,應(yīng)該迎接改變。 - 右擊
XIB
或SB
文件 ->Open as
->Source Code
,刪除xml
文件中下面一行字段。
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
編譯錯誤
升級Xcode
之后,Xcode8
對之前的一些修飾符和語句不兼容,會導致一些編譯錯誤。這種錯誤導致的原因很多,這里大致列幾條,各位還是根據(jù)自身遇到的情況做修改吧。
- 之前一些泛型相關(guān)的修飾符,
nullable
之類的有的會報錯。 -
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
推送通知
蘋果的推送在之前iOS8
和iOS9
的時候就發(fā)生過大的更新,推送功能越來越強大。在iOS10
之后蘋果推出了UserNotifications
框架,可以通過這個框架更好的控制推送通知,可以更新、修改鎖屏頁面的推送消息,可以添加圖片等功能。
但是在Xcode8
打包時可能會出現(xiàn)一個問題,同一份代碼在用Xcode8
打包后,并且不對代碼進行修改的情況下上傳App Store
后,會發(fā)現(xiàn)打包后蘋果發(fā)來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對代碼做修改,否則將不能使用推送通知。
這是因為在Xcode8
之后,如果需要使用Push Notifications
的功能,需要勾選Capabilities
-> Push Notifications
為YES
,否則進行遠程推送就會有問題,并且會收到蘋果發(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
即可。
順便提一下,這兩天在設(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