Xcode8帶來的新特性和坑
該文章屬於<簡書 — 劉小壯>原創,轉載請註明:
這段時間身邊發生了很多事,工作和學習也有點靜不下心來。同事的離開,公司的變化,生活的需要.....想做的事太多,可時間就是這麼點,諸多無奈啊。總之一句話,無論做什麼事,靜下心來是非常重要的。
回到正題,
Xcode8
正式版在9月13日已經推送給開發者下載,我也在十一回來之後,就下載了新的Xcode
。下載之後就出現了很多編譯錯誤,之前的外掛也不能用了,但是發現Xcode8
把好多不錯的外掛功能整合到自身了,感覺這點也挺不錯。每個版本
Xcode
都會帶來很多新特性,Xcode8
也不例外,這些新特性會給我們的開發帶來便利,也會帶來很多坑。所以今天打算寫一篇文章,詳細講一下Xcode8
給我們帶來的新特性以及帶來的坑,以及我使用過程中遇到的一些問題,希望能幫助到其他朋友。
Xcode8新特性
Xcode8
Interface Builder
隨著14年的iPhone6和6P出來之後,iPhone的螢幕尺寸也越來越多,螢幕適配是一個需要解決的問題,以後不一定蘋果又出什麼尺寸的iPhone呢。
在iPhone6和6P釋出的同一年,蘋果推出的Xcode6
中在原有的Auto layout
的基礎上,添加了Size Classes
新特性,通過這個新特性可以使用一個XIB
或者SB
檔案,適配不同的螢幕以及iPhone和iPad兩種裝置。
在Xcode8
中,蘋果推出了更加強大的視覺化編輯工具預覽功能,可以在不執行App
XIB
或SB
在不同螢幕尺寸下的顯示。(這個功能我記得之前Xcode
就有,只是隱藏的比較深,蘋果現在給拿到外面了)
選擇一個XIB
檔案進去,點選下面紅框的位置,會出現從3.5寸-5.5寸一系列螢幕尺寸的選項。直接點選不同螢幕尺寸,以及橫豎屏選項,切換不同的螢幕顯示。在iPad上還可以選擇是否分屏,功能非常強大。
Interface Builder
在右邊有一個Vary for Traits
選項,點選這個選項就可以同時顯示所有可選的螢幕樣式,功能和上面圖片都一樣,只是顯示上看起來比較多。
Interface Builder
還有一點,新建立的XIB
控制元件尺寸,不再是之前600*600
XIB
檔案,看起來舒服多了。
Target中General的變化
在Xcode8
之前,都需要自己設定證書和描述檔案。如果設定出現錯誤的情況下,還可以通過點選Fix issue
來修復這個錯誤。但這有個問題就在於,Fix issue
選項並不是那麼好用,有的時候設定是正確的這裡也提示需要Fix issue
。
可能蘋果也意識到這個問題的存在,在Xcode8
中可以通過Automatically manage signing
選項,讓蘋果為我們管理證書和配置檔案,設定也都是由蘋果來完成的。在Xcode8
中新建專案,這個選項預設是被勾選的。
Automatically manage signing
從上面圖中可以看到,蘋果幫我們自動管理了證書和配置檔案。而且在之前的專案中,如果想要設定安裝後顯示在手機上的App
名字,還需要自己到Info.plist
檔案中,修改Display Name
欄位,而現在直接在General
中就可以做修改,這個修改和Info.plist
是同步的。
但是,如果我想自己管理證書和描述檔案呢?只需要去掉Automatically manage signing
選項。
Automatically manage signing
如果自己到Build Settings
中手動設定證書和描述檔案,可以發現Provisioning Profile
選項已經被標明為Deprecated,也就是蘋果並不推薦手動設定。
Xcode外掛
升級Xcode8
之後會發現,在Xcode8
中所有第三方外掛都失效了,並且連之前選單欄的外掛選項也不存在了。在之前很多iOS開發者,都是通過Alcatraz來管理外掛的,現在Alcatraz也是不可用的。但是Xcode8
自身也對編譯器進行了升級,將一些比較好的外掛功能加入到Xcode
中,例如單行高亮顯示等。
在Xcode8
中支援了開發外掛工程,並且為我們提供了一個外掛模板,開發的外掛可以上傳到App Store下載。蘋果這麼做有一個原因在於,之前Xcode
和外掛是執行在同一個程序的,所以外掛的崩潰也會導致Xcode
崩潰。蘋果現在將外掛作為一個單獨的應用程式,分開程序執行,不會對Xcode
帶來其他影響。
Xcode Source Editor Extension
Runtime Issues
在開發過程中,因為語法或明顯的程式碼錯誤(例如Retain Cycle
),編譯器可以發現並報黃色或紅色警告。但是一些因為程式碼邏輯導致的錯誤,編譯器並沒有辦法找到。例如下面的這句程式碼,因為程式碼邏輯的問題導致兩個陣列相互引用,都不能釋放。
陣列迴圈引用
這時候可以通過Xcode8
提供的Runtime Issues
新特性,查詢到執行過程中出現的問題,並通過Graph的方式將問題視覺化的展現給開發者。
Runtime Issues
Debug Memory Graph
在Xcode6
中出現了Debug View Hierarchy
新特性,可以通過其除錯當前App
的檢視層級,查詢UI相關的bug
非常方便。在Xcode8
中蘋果為開發者提供了Debug Memory Graph
特性,通過這個新特性,可以直接選擇一個物件,檢視與其相關的記憶體關係。
Debug Memory Graph
Debug Memory Graph
和Runtime Issues
可以配合使用,通過Debug Memory Graph
分析記憶體關係完成後,點選Runtime Issues
可以看到已經發現的記憶體問題。
Swift 3
Xcode8
帶來了新版本的Swift3
,新版本的Swift
變化較大,如果舊版的Swift
專案在Xcode8
上編譯可能會失敗。對此,蘋果為開發者提供了Swift
遷移工具,聽說不太好用(我沒用過這個工具)。
如果不想立刻就遷移到Swift3
,可以在Builder Settings
中進行設定,選擇Use Legacy Swift Language Version
設定為YES,就可以繼續使用舊版本的Swift2.3
。
Use Legacy Swift Language Version
其他更新
Xcode
新版字型,SF Mono Regular
字型。更新Xcode
之後我比較喜歡這種字型,看起來程式碼非常工整。- 被編輯的行高亮顯示。之前
Xcode
有個外掛就是這個功能,Xcode8
把高亮功能整合進來了,使用起來很方便。 - 最新版的API文件,展示樣式發生了很大的改變。
- 更方便的生成文件(就是喵神寫的
VVDocumenter
),在Xcode8
中可以將游標放在方法上面,通過option + command + /
快捷鍵生成文件註釋。
Xcode8適配
XIB和Storeboard適配
在Xcode8
之前,建立一個XIB
或SB
檔案,都是一個600*600的方塊XIB
檔案。在Xcode8
之後,建立的XIB
檔案預設是6s尺寸的大小。
但是Xcode8
開啟之前舊專案的XIB
或SB
檔案時,會彈出下面的彈框, 這時候一般直接選擇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.
有兩種方法解決這個問題:
- 你同事也升級
Xcode8
,比較推薦這種方式,應該迎接改變。 - 右擊
XIB
或SB
檔案 ->Open as
->Source Code
,刪除xml檔案中下面一行欄位。
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
編譯錯誤
升級Xcode
之後,Xcode8
對之前的一些修飾符和語句不相容,會導致一些編譯錯誤。這種錯誤導致的原因很多,這裡大致列幾條,各位還是根據自身遇到的情況做修改吧。
- 之前一些泛型相關的修飾符,
nullable
之類的有的會報錯。 CAAnimation
及其子類,設定代理屬性後,必須在@interface()
遵守代理,否則報錯,等等。
許可權適配
這應該算iOS10系統適配的範疇,最近這兩個都在弄,所以就直接和Xcode8
適配一起寫出來了。
在iOS10之後需要在Info.plist
中,新增新的欄位獲取許可權,否則在iOS10上執行會導致崩潰。下面是一些常用的欄位,如果有缺少的麻煩各位評論區補充一下。
Key | 許可權 |
---|---|
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 | 日曆 |
推送通知
蘋果的推送在之前iOS8和iOS9的時候就發生過大的更新,推送功能越來越強大。在iOS10之後蘋果推出了UserNotifications
框架,可以通過這個框架更好的控制推送通知,可以更新、修改鎖屏頁面的推送訊息,可以新增圖片等功能。
但是在Xcode8
打包時可能會出現一個問題,同一份程式碼在用Xcode8
打包後,並且不對程式碼進行修改的情況下上傳App Store後,會發現打包後蘋果發來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對程式碼做修改,否則將不能使用推送通知。
Push Notifications
這是因為在Xcode8
之後,如果需要使用Push Notifications
的功能,需要勾選Capabilities
->
Push Notifications
為YES,否則進行遠端推送就會有問題,並且會收到蘋果發來的這封郵件。
刪除系統log
升級Xcode8
之後,在除錯和執行過程中,發現控制檯列印了很多不認識的log,這些log是系統列印的,和開發者沒關係。但是這麼多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
欄位,並設定為Disable即可。
OS_ACTIVITY_MODE
順便提一下,這兩天在設定log選項的時候,發現可以通過在Arguments
中設定引數,打印出App
載入的時長,包括整體載入時長,動態庫載入時長等。
在Environment Variables
中新增DYLD_PRINT_STATISTICS
欄位,並設定為YES,在控制檯就會列印載入時長。
控制檯列印資訊
awakeFromNib報警告
老專案在Xcode8
中,有些重寫awakeFromNib
方法的地方,會報下面的錯誤。這是因為沒有呼叫super
的方法導致的,還好我平時都是呼叫super
的,我程式碼目前還沒出問題。
Method possibly missing a [super awakeFromNib] call
文/劉小壯(簡書作者)
原文連結:http://www.jianshu.com/p/c1904fd8db06
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。