Xcode8帶來的新特性和坑

上天眷顧我發表於2016-10-27
該文章屬於<簡書 — 劉小壯>原創,轉載請註明:

<簡書 — 劉小壯> http://www.jianshu.com/p/c1904fd8db06


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

回到正題,Xcode8正式版在9月13日已經推送給開發者下載,我也在十一回來之後,就下載了新的Xcode。下載之後就出現了很多編譯錯誤,之前的外掛也不能用了,但是發現Xcode8把好多不錯的外掛功能整合到自身了,感覺這點也挺不錯。

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


Xcode8新特性


Xcode8

Interface Builder

隨著14年的iPhone6和6P出來之後,iPhone的螢幕尺寸也越來越多,螢幕適配是一個需要解決的問題,以後不一定蘋果又出什麼尺寸的iPhone呢。

iPhone66P釋出的同一年,蘋果推出的Xcode6中在原有的Auto layout的基礎上,新增了Size Classes新特性,通過這個新特性可以使用一個XIB或者SB檔案,適配不同的螢幕以及iPhoneiPad兩種裝置。

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

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


Interface Builder

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


Interface Builder

還有一點,新建立的XIB控制元件尺寸,不再是之前600*600的方塊了,而是預設是6s的長方形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 GraphRuntime 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

其他更新

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

Xcode8適配

XIB和Storeboard適配

Xcode8之前,建立一個XIBSB檔案,都是一個600*600的方塊XIB檔案。在Xcode8之後,建立的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,比較推薦這種方式,應該迎接改變。
  2. 右擊XIBSB檔案 -> Open as -> Source Code,刪除xml檔案中下面一行欄位。
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

編譯錯誤

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

  1. 之前一些泛型相關的修飾符,nullable之類的有的會報錯。
  2. 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 日曆

參考資料:developer.apple

推送通知

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

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


Push Notifications

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

刪除系統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
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關文章