你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> Xcode 8帶來的新特性和坑

Xcode 8帶來的新特性和坑

編輯:IOS開發基礎

作者:劉小壯

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

每個版本Xcode都會帶來很多新特性,Xcode 8也不例外,這些新特性會給我們的開發帶來便利,也會帶來很多坑。所以今天打算寫一篇文章,詳細講一下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上還可以選擇是否分屏,功能非常強大。

21.png

Interface Builder

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

22.png

Interface Builder

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

Target中General的變化

在Xcode8之前,都需要自己設置證書和描述文件。如果設置出現錯誤的情況下,還可以通過點擊Fix issue來修復這個錯誤。但這有個問題就在於,Fix issue選項並不是那麼好用,有的時候設置是正確的這裡也提示需要Fix issue。

可能蘋果也意識到這個問題的存在,在Xcode8中可以通過Automatically manage signing選項,讓蘋果為我們管理證書和配置文件,設置也都是由蘋果來完成的。在Xcode8中新建項目,這個選項默認是被勾選的。

23.png

Automatically manage signing

從上面圖中可以看到,蘋果幫我們自動管理了證書和配置文件。而且在之前的項目中,如果想要設置安裝後顯示在手機上的App名字,還需要自己到Info.plist文件中,修改Display Name字段,而現在直接在General中就可以做修改,這個修改和Info.plist是同步的。

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

24.png

Automatically manage signing

如果自己到Build Settings中手動設置證書和描述文件,可以發現Provisioning Profile選項已經被標明為Deprecated,也就是蘋果並不推薦手動設置。

Xcode插件

升級Xcode8之後會發現,在Xcode8中所有第三方插件都失效了,並且連之前菜單欄的插件選項也不存在了。在之前很多iOS開發者,都是通過Alcatraz來管理插件的,現在Alcatraz也是不可用的。但是Xcode8自身也對編譯器進行了升級,將一些比較好的插件功能加入到Xcode中,例如單行高亮顯示等。

在Xcode8中支持了開發插件工程,並且為我們提供了一個插件模板,開發的插件可以上傳到App Store下載。蘋果這麼做有一個原因在於,之前Xcode和插件是運行在同一個進程的,所以插件的崩潰也會導致Xcode崩潰。蘋果現在將插件作為一個單獨的應用程序,分開進程運行,不會對Xcode帶來其他影響。

25.png

Xcode Source Editor Extension

Runtime Issues

在開發過程中,因為語法或明顯的代碼錯誤(例如Retain Cycle),編譯器可以發現並報黃色或紅色警告。但是一些因為代碼邏輯導致的錯誤,編譯器並沒有辦法找到。例如下面的這句代碼,因為代碼邏輯的問題導致兩個數組相互引用,都不能釋放。

26.png

數組循環引用

這時候可以通過Xcode8提供的Runtime Issues新特性,查找到運行過程中出現的問題,並通過Graph的方式將問題可視化的展現給開發者。

27.png

Runtime Issues

Debug Memory Graph

在Xcode6中出現了Debug View Hierarchy新特性,可以通過其調試當前App的視圖層級,查找UI相關的bug非常方便。在Xcode8中蘋果為開發者提供了Debug Memory Graph特性,通過這個新特性,可以直接選擇一個對象,查看與其相關的內存關系。

28.png

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。

29.png

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即可。

30.png

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文件中下面一行字段。

31.png

編譯錯誤

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

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

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

權限適配

這應該算iOS10系統適配的范疇,最近這兩個都在弄,所以就直接和Xcode8適配一起寫出來了。

在iOS10之後需要在Info.plist中,添加新的字段獲取權限,否則在iOS10上運行會導致崩潰。下面是一些常用的字段,如果有缺少的麻煩各位評論區補充一下。

222.png

參考資料:developer.apple

推送通知

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

但是在用Xcode8打包後,並且不對代碼進行修改的情況下,會發現打包後蘋果發來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對代碼做修改,否則將不能使用推送通知。

33.png

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即可。

35.png

OS_ACTIVITY_MODE

順便提一下,這兩天在設置log選項的時候,發現可以通過在Arguments中設置參數,打印出App加載的時長,包括整體加載時長,動態庫加載時長等。

在Environment Variables中添加DYLD_PRINT_STATISTICS字段,並設置為YES,在控制台就會打印加載時長。

38.png

控制台打印信息

awakeFromNib報警告

老項目在Xcode8中,有些重寫awakeFromNib方法的地方,會報下面的錯誤。這是因為沒有調用super的方法導致的,還好我平時都是調用super的,我代碼目前還沒出問題。

Method possibly missing a [super awakeFromNib] call


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved