Xcode 8帶來的新特性和坑

2021-02-15 Cocoa開發者社區

▲點擊上方「CocoaChina」關注即可免費學習iOS開發

本文為投稿文章

原文連結:http://www.jianshu.com/p/c1904fd8db06


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上還可以選擇是否分屏,功能非常強大。

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 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 + /快捷鍵生成文檔注釋。

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.

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

你同時也升級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上運行會導致崩潰。下面是一些常用的欄位,如果有缺少的麻煩各位評論區補充一下。

參考資料: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,在控制臺就會列印加載時長。

控制臺列印信息

awakeFromNib報警告

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

Method possibly missing a [super awakeFromNib] call

微信號:CocoaChinabbs


▲長按二維碼「識別」關注即可免費學習 iOS 開發

月薪十萬、出任CEO、贏娶白富美、走上人生巔峰不是夢

--------

商務合作QQ:2408167315

投稿郵箱:support@cocoachina.com

相關焦點

  • Xcode 8 有哪些新特性
    來自:http://www.skyfox.org/new-features-in-xcode8.htmlXcode 8包括所有你需要的東西
  • Xcode 12 新特性
    譯自 https://medium.com/better-programming/whats-new-in-xcode-12-7eb6a71af8d1
  • iOS開發 適配iOS10以及Xcode8
    就我的使用來說,總體覺得蘋果還是坑不斷,但是也在一直進步的啦。下面我就來說說,iOS10的適配以及Xcode8使用上的一些注意點。一、證書管理用Xcode8打開工程後,比較明顯的就是下圖了,這個是蘋果的新特性,可以幫助我們自動管理證書。
  • Xcode9和Swift4新特性
    標示功能    8. 協議自動補全    9. 代碼段自動抽出函數    10. 自定義顏色名稱    11. Debug View Hierarchy可以顯示ViewController了    12.支持Markdown,可以在xcode中查閱、編輯markdown文件Swift4更新    1. Extension可以訪問private的屬性    2.
  • Xcode8 10大新特性
    系統可以根據當前設備通過 runtime 自動調整圖片來呈現 @2x 和 @1x系統能夠自適應的展示貼紙,所以為了更好的展示貼紙,最好提供的貼紙是以下三種大小的類型小型 100100中型 136136大型 206*2062.iMessage應用iMessage app使用完整的框架和Message app進行交互。
  • Xcode(v 8.3.3)菜單欄選項及作用介紹
    Tab 新標籤Window 新窗口File 新文件Target… 新目標Project… 新項目Workspace… 新的工作區Group 新組Group from Selection 從選擇中建立新組Save :保存Duplicate:複製(整個文件, eg:
  • 全新設計的Xcode 12
    事實上,Xcode 12 本身就是作為 Universal app 而構建,可以原生運行在 Intel x86_64 CPU 和基於 ARM 的 Apple 晶片上。Xcode 12 還提供了統一的 macOS SDK,其中包含所有框架、編譯器、調試器和其他工具,以幫助構建在 Apple 晶片和 Intel x86_64 CPU 上原生運行的應用程式。
  • iOS開發周報:Xcode 7.3 beta 和 iOS 9.3 beta 發布,是否會帶來教育行業的改變
    Xcode 7.3 beta 發布 (https://developer.apple.com/xcode/download/) :Apple 發布了新的測試版本的開發者工具。Xcode 7.3 中包括了像是更完善的自動補全,更智能和全面的編譯器警告提示等。
  • 全新設計的 Xcode 12
    事實上,Xcode 12 本身就是作為 Universal app 而構建,可以原生運行在 Intel x86_64 CPU 和基於 ARM 的 Apple 晶片上。Xcode 12 還提供了統一的 macOS SDK,其中包含所有框架、編譯器、調試器和其他工具,以幫助構建在 Apple 晶片和 Intel x86_64 CPU 上原生運行的應用程式。
  • 同時兼容 Xcode7 和 Xcode8
    譯者:ckitakishi;校對:Channe;定稿:CMB作為一名 iOS 開發者,你一定對 iOS 10 帶來的新特性感到無比興奮
  • Mac上有多款 Xcode,如何設置默認的 Xcode
    所以目前我電腦上有兩款 Xcode IDE(Xcode 和 Xcode-beta)。當我打開項目的時候發現系統默認選擇的是正式版的 Xcode。那麼如何設置使其默認選擇新的 Xcode-beta 呢?相信長時間用 Mac 開發的開發者會對一個命令行有印象,那就是 xcode-select。(看名字就知道這東西就是今天的主角。)
  • iOS開發|適配iOS10以及Xcode8
    ▲點擊上方「CocoaChina」關注即可免費學習iOS開發原文連結:http://www.jianshu.com/p/9756992a35ca一、證書管理用Xcode8打開工程後,比較明顯的就是下圖了,這個是蘋果的新特性
  • Xcode 插件優缺點對比(推薦 20 款插件)
    當然也有弊端就是你敲一個很普通的方法下面都會匹配一大長串,看著有點冗餘而且xcode會比較卡,並且敲出來是好好地如果你想用delete一個個字符往回刪就可能會出現xcode,crash了(也許是和其他某個插件產生了衝突,我錯怪他了)。
  • 零代碼,用xcode輕鬆搞定交互動畫-為設計師準備的Xcode教程(3)
    xcode對於設計師來說,大部分人可能並不是很感冒,但我想在這裡冒著文章點擊量不高,反響不那麼好的風險,繼續我們的xcode教程。畢竟有很多朋友繼續支持著靜電,讓靜電有動力繼續為大家普及xcode的知識。其實,只要你稍微花一點點耐心,那麼「看起來」稍顯複雜的xcode界面只會是一隻紙老虎,剝繭抽絲,讓我們一同繼續來發掘iOS開發工具的絕妙之處,特別是對於我們設計師的。
  • Xcode 12.5 新特性一覽
    Code Completion在包含錯誤的表達式中以及在沒有附加上下文的情況下含糊不清的表達式中,代碼完成更為可靠。 Instruments 現在可以從包含日誌記錄級別數據的 ktrace 文件中導入 os_log 和 os_signpost 數據。Custom Instruments 可以指定靜態定義的子軌道,而無需由表列數據驅動。xctrace export 會按時間順序生成輸出。針對 xctrace 的目錄查詢公開了有關運行的元數據信息。
  • ES2021 帶來的新特性
    ES2021(ES12)將會帶來
  • Xcode 11.4 新特性概覽
    Xcode 11.4 發布,添加了不少新特性
  • Xcode 13.0 和 iOS 15.0 適配
    ↓推薦關注↓看了掘友的文章後,今天才升級xcode13
  • 深夜裡安靜的編譯一個OpenJDK8,坑太多
    https://hg.openjdk.java.net/jdk8u/jdk8u openjdk8chmod u+x get_source.shchmod u+x configure.敬請期待~遇到的坑問題一:Xcode 4 is required to build JDK 8configure: error: Xcode 4 is required to build JDK 8, the version found was 11.4.1.
  • Laravel 8 新特性和功能優化速覽
    Laravel 8.0 版本即將在 9 月 8 號發布,作者 Taylor Otwell 在 Twitter 中陸續透露了一些新特性和功能優化,