Xcode8.0新特性和新的問題

Xcode8 新特性html

Interface Builder

隨着14年的iPhone6和6P出來以後,iPhone的屏幕尺寸也愈來愈多,屏幕適配是一個須要解決的問題,之後不必定蘋果又出什麼尺寸的iPhone呢。數組

在iPhone6和6P發佈的同一年,蘋果推出的Xcode6中在原有的Auto layout的基礎上,添加了Size Classes新特性,經過這個新特性可使用一個XIB或者SB文件,適配不一樣的屏幕以及iPhone和iPad兩種設備。xcode

在Xcode8中,蘋果推出了更增強大的可視化編輯工具預覽功能,能夠在不運行App的狀況下,預覽當前XIB或SB在不一樣屏幕尺寸下的顯示。(這個功能我記得以前Xcode就有,只是隱藏的比較深,蘋果如今給拿到外面了)安全

選擇一個XIB文件進去,點擊下面紅框的位置,會出現從3.5寸-5.5寸一系列屏幕尺寸的選項。直接點擊不一樣屏幕尺寸,以及橫豎屏選項,切換不一樣的屏幕顯示。在iPad上還能夠選擇是否分屏,功能很是強大。app

Interface Builder框架

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

Interface Builder字體

還有一點,新建立的XIB控件尺寸,再也不是以前600*600的方塊了,而是默認是6s的長方形XIB文件,看起來舒服多了。ui

Target中General的變化

在Xcode8以前,都須要本身設置證書和描述文件。若是設置出現錯誤的狀況下,還能夠經過點擊Fix issue來修復這個錯誤。但這有個問題就在於,Fix issue選項並非那麼好用,有的時候設置是正確的這裏也提示須要Fix issue。this

可能蘋果也意識到這個問題的存在,在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

其餘更新

  1. Xcode新版字體,SF Mono Regular字體。更新Xcode以後我比較喜歡這種字體,看起來代碼很是工整。

  2. 被編輯的行高亮顯示。以前Xcode有個插件就是這個功能,Xcode8把高亮功能集成進來了,使用起來很方便。

  3. 最新版的API文檔,展現樣式發生了很大的改變。

  4. 更方便的生成文檔(就是喵神寫的VVDocumenter),在Xcode8中能夠將光標放在方法上面,經過option + command + /快捷鍵生成文檔註釋。

Xcode 8適配

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.

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

  1. 你同事也升級Xcode8,比較推薦這種方式,應該迎接改變。

  2. 右擊XIB或SB文件 -> Open as -> Source Code,刪除xml文件中下面一行字段。

編譯錯誤

升級Xcode以後,Xcode8對以前的一些修飾符和語句不兼容,會致使一些編譯錯誤。這種錯誤致使的緣由不少,這裏大體列幾條,各位仍是根據自身遇到的狀況作修改吧。

  1. 以前一些泛型相關的修飾符,nullable之類的有的會報錯。

  2. CAAnimation及其子類,設置代理屬性後,必須在@interface()遵照代理,不然報錯,等等。

權限適配

這應該算iOS10系統適配的範疇,最近這兩個都在弄,因此就直接和Xcode8適配一塊兒寫出來了。

在iOS10以後須要在Info.plist中,添加新的字段獲取權限,不然在iOS10上運行會致使崩潰。下面是一些經常使用的字段,若是有缺乏的麻煩各位評論區補充一下。

參考資料: developer.apple

推送通知

蘋果的推送在以前iOS8和iOS9的時候就發生過大的更新,推送功能愈來愈強大。在iOS10以後蘋果推出了UserNotifications框架,能夠經過這個框架更好的控制推送通知,能夠更新、修改鎖屏頁面的推送消息,能夠添加圖片等功能。

可是在用Xcode8打包後,而且不對代碼進行修改的狀況下,會發現打包後蘋果發來了一封郵件。這封郵件大概意思是若是須要使用推送通知,須要對代碼作修改,不然將不能使用推送通知。

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,在控制檯就會打印加載時長。

控制檯打印信息

 

代碼註釋不能用的解決辦法

這個是由於蘋果解決xcode ghost,把插件屏蔽了。
解決方法
打開終端,命令運行: sudo /usr/libexec/xpccachectl
而後必須重啓電腦後生效。
VVDocumenter-Xcode沒法使用的解決辦法:
使用快捷鍵:option + command + /

隱私數據訪問問題:

你的項目中訪問了隱私數據,好比:相機,相冊,聯繫人等,在Xcode8中打開編譯的話,通通會crash,控制檯會輸出下面這樣的日誌:


 

這是由於iOS對用戶的安全和隱私的加強,在申請不少私有權限的時候都須要添加描述,可是,在使用Xcode 8以前的Xcode仍是使用系統的權限通知框.要想解決這個問題,只須要在info.plist
添加NSContactsUsageDescription
的key, value本身隨意填寫就能夠,這裏列舉出對應的key(Source Code模式下):

<!-- 相冊 --> <key>NSPhotoLibraryUsageDescription</key> <string>App須要您的贊成,才能訪問相冊</string> <!-- 相機 --> <key>NSCameraUsageDescription</key> <string>App須要您的贊成,才能訪問相機</string> <!-- 麥克風 --> <key>NSMicrophoneUsageDescription</key> <string>App須要您的贊成,才能訪問麥克風</string> <!-- 位置 --> <key>NSLocationUsageDescription</key> <string>App須要您的贊成,才能訪問位置</string> <!-- 在使用期間訪問位置 --><key>NSLocationWhenInUseUsageDescription</key> <string>App須要您的贊成,才能在使用期間訪問位置</string> <!-- 始終訪問位置 --> <key>NSLocationAlwaysUsageDescription</key> <string>App須要您的贊成,才能始終訪問位置</string> <!-- 日曆 --> <key>NSCalendarsUsageDescription</key> <string>App須要您的贊成,才能訪問日曆</string> <!-- 提醒事項 --> <key>NSRemindersUsageDescription</key> <string>App須要您的贊成,才能訪問提醒事項</string> <!-- 運動與健身 --> <key>NSMotionUsageDescription</key> <string>App須要您的贊成,才能訪問運動與健身</string> <!-- 健康更新 --> <key>NSHealthUpdateUsageDescription</key> <string>App須要您的贊成,才能訪問健康更新 </string> <!-- 健康分享 --> <key>NSHealthShareUsageDescription</key> <string>App須要您的贊成,才能訪問健康分享</string> <!-- 藍牙 --> <key>NSBluetoothPeripheralUsageDescription</key> <string>App須要您的贊成,才能訪問藍牙</string> <!-- 媒體資料庫 --> <key>NSAppleMusicUsageDescription</key> <string>App須要您的贊成,才能訪問媒體資料庫</string>

若是不起做用,能夠請求後臺權限,相似於這樣:

<key>UIBackgroundModes</key><array> <!-- 在這裏寫上你在後臺模式下要使用權限對應的key --> <string>location</string>...</array>

或者在Xcode裏選中當前的target,選擇Capabilities,找到Background Modes,打開它,在裏面選擇對應權限

相關文章
相關標籤/搜索