Xcode8帶來的新特性和坑
該文章屬於<簡書 — 劉小壯>原創,轉載請註明:
<簡書 — 劉小壯> http://www.jianshu.com/p/c1904fd8db06
這段時間身邊發生了很多事,工作和學習也有點靜不下心來。同事的離開,公司的變化,生活的需要.....想做的事太多,可時間就是這麼點,諸多無奈啊。總之一句話,無論做什麼事,靜下心來是非常重要的。
回到正題,
Xcode8
正式版在9月13日已經推送給開發者下載,我也在十一回來之後,就下載了新的Xcode
。下載之後就出現了很多編譯錯誤,之前的外掛也不能用了,但是發現Xcode8
把好多不錯的外掛功能整合到自身了,感覺這點也挺不錯。每個版本
Xcode
都會帶來很多新特性,Xcode8
也不例外,這些新特性會給我們的開發帶來便利,也會帶來很多坑。所以今天打算寫一篇文章,詳細講一下Xcode8
給我們帶來的新特性以及帶來的坑,以及我使用過程中遇到的一些問題,希望能幫助到其他朋友。
Xcode8新特性
![](https://i.iter01.com/images/f849cd14a6eb3ffae04602aae7b4d1b05cd6c27d609c8fce698c0d3a31c4eca1.png)
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上還可以選擇是否分屏,功能非常強大。
![](https://i.iter01.com/images/ef51e937b92586934cbbdea63ce389eda69773e4ba207860135d2b9144e6475b.png)
在右邊有一個Vary for Traits
選項,點選這個選項就可以同時顯示所有可選的螢幕樣式,功能和上面圖片都一樣,只是顯示上看起來比較多。
![](https://i.iter01.com/images/3cf1f95556c0010f07a7647abb79f7c54804b46d62b9f7dca079dcb7f2431797.png)
還有一點,新建立的XIB
控制元件尺寸,不再是之前600*600的方塊了,而是預設是6s的長方形XIB
檔案,看起來舒服多了。
Target中General的變化
在Xcode8
之前,都需要自己設定證書和描述檔案。如果設定出現錯誤的情況下,還可以通過點選Fix issue
來修復這個錯誤。但這有個問題就在於,Fix issue
選項並不是那麼好用,有的時候設定是正確的這裡也提示需要Fix issue
。
可能蘋果也意識到這個問題的存在,在Xcode8
中可以通過Automatically manage signing
選項,讓蘋果為我們管理證書和配置檔案,設定也都是由蘋果來完成的。在Xcode8
中新建專案,這個選項預設是被勾選的。
![](https://i.iter01.com/images/01af6d0c41448896934c638880015764fb39c9ec035d251de799244c0260b3f1.png)
從上面圖中可以看到,蘋果幫我們自動管理了證書和配置檔案。而且在之前的專案中,如果想要設定安裝後顯示在手機上的App
名字,還需要自己到Info.plist
檔案中,修改Display Name
欄位,而現在直接在General
中就可以做修改,這個修改和Info.plist
是同步的。
但是,如果我想自己管理證書和描述檔案呢?只需要去掉Automatically manage signing
選項。
![](https://i.iter01.com/images/fedb7a68ee6ab023630700f25cc7bcc1fda5f02edd906caac76821d1fe496b63.png)
如果自己到Build Settings
中手動設定證書和描述檔案,可以發現Provisioning Profile
選項已經被標明為Deprecated,也就是蘋果並不推薦手動設定。
Xcode外掛
升級Xcode8
之後會發現,在Xcode8
中所有第三方外掛都失效了,並且連之前選單欄的外掛選項也不存在了。在之前很多iOS開發者,都是通過Alcatraz來管理外掛的,現在Alcatraz也是不可用的。但是Xcode8
自身也對編譯器進行了升級,將一些比較好的外掛功能加入到Xcode
中,例如單行高亮顯示等。
在Xcode8
中支援了開發外掛工程,並且為我們提供了一個外掛模板,開發的外掛可以上傳到App Store下載。蘋果這麼做有一個原因在於,之前Xcode
和外掛是執行在同一個程式的,所以外掛的崩潰也會導致Xcode
崩潰。蘋果現在將外掛作為一個單獨的應用程式,分開程式執行,不會對Xcode
帶來其他影響。
![](https://i.iter01.com/images/e262f864f6d7aa37ff9f6413152bd3ecd2f28bd96a2a4073e35a7adfda90abfa.png)
Runtime Issues
在開發過程中,因為語法或明顯的程式碼錯誤(例如Retain Cycle
),編譯器可以發現並報黃色或紅色警告。但是一些因為程式碼邏輯導致的錯誤,編譯器並沒有辦法找到。例如下面的這句程式碼,因為程式碼邏輯的問題導致兩個陣列相互引用,都不能釋放。
![](https://i.iter01.com/images/4240006c1a4a4f5ae8e8abdf577ef75ef6682ee4dacbe7f8bd8dd2f7c8befafa.png)
這時候可以通過Xcode8
提供的Runtime Issues
新特性,查詢到執行過程中出現的問題,並通過Graph的方式將問題視覺化的展現給開發者。
![](https://i.iter01.com/images/8e9c6ed12e3a01d814987f1159a48a42ae0833c1f9741c2afc3894adaa88a057.png)
Debug Memory Graph
在Xcode6
中出現了Debug View Hierarchy
新特性,可以通過其除錯當前App
的檢視層級,查詢UI相關的bug
非常方便。在Xcode8
中蘋果為開發者提供了Debug Memory Graph
特性,通過這個新特性,可以直接選擇一個物件,檢視與其相關的記憶體關係。
![](https://i.iter01.com/images/98ac75bb898fcbb7efcfb26ba73a215672b396806691c4dfb0f74af5b3f187fd.png)
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
。
![](https://i.iter01.com/images/7b377c6dbb0deb53a6d8b8c94997f490c7ea57ffd4c69313b75901b15ece5e5c.png)
其他更新
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即可。
![](https://i.iter01.com/images/305dc130ddf47d4dac602439021af51821b32a9ec0e3fa00e40737f33054b2f3.png)
但是這樣有個問題,如果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 | 日曆 |
參考資料:developer.apple
推送通知
蘋果的推送在之前iOS8和iOS9的時候就發生過大的更新,推送功能越來越強大。在iOS10之後蘋果推出了UserNotifications
框架,可以通過這個框架更好的控制推送通知,可以更新、修改鎖屏頁面的推送訊息,可以新增圖片等功能。
但是在Xcode8
打包時可能會出現一個問題,同一份程式碼在用Xcode8
打包後,並且不對程式碼進行修改的情況下上傳App Store後,會發現打包後蘋果發來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對程式碼做修改,否則將不能使用推送通知。
![](https://i.iter01.com/images/021c32420eda11756f3f341dd5e1fa04c16ae370aa5ea9a955b63b0a95bda535.png)
這是因為在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即可。
![](https://i.iter01.com/images/4395085cf6934a440dd191c7bb0172dd1bff3a6cc0102f6cce4a0865b6c51d6a.png)
順便提一下,這兩天在設定log選項的時候,發現可以通過在Arguments
中設定引數,列印出App
載入的時長,包括整體載入時長,動態庫載入時長等。
在Environment Variables
中新增DYLD_PRINT_STATISTICS
欄位,並設定為YES,在控制檯就會列印載入時長。
![](https://i.iter01.com/images/9e6cacf4213981a65b8dcd19ef0c0fe674a593b1078ae0c96fd5914a65785989.png)
awakeFromNib報警告
老專案在Xcode8
中,有些重寫awakeFromNib
方法的地方,會報下面的錯誤。這是因為沒有呼叫super
的方法導致的,還好我平時都是呼叫super
的,我程式碼目前還沒出問題。
Method possibly missing a [super awakeFromNib] call
原文連結:http://www.jianshu.com/p/c1904fd8db06
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
相關文章
- .NET 5 帶來的新特性 [MemberNotNull] 與 [MemberNotNullWhen]Null
- Superedge的新特性和未來之路
- Java 14 可能帶來什麼新特性?Java
- MySQL 5.7 新特性大全和未來展望MySql
- Flutter 1.17版本釋出,帶來多個新特性Flutter
- 因為我的一次疏忽而帶來的golang1.23新特性Golang
- SQL Server 2008資料複製新特性及其帶來的價值(下)XDSQLServer
- 公司ES升級帶來的坑怎麼填?
- Laravel 5.8 新特性和新變化 — 影片Laravel
- Oracle 18c新特性詳解 - 表和表空間相關的新特性Oracle
- 那些激動人心的React,Webpack,Babel的新特性對於我們開發體驗帶來哪些提升ReactWebBabel
- C#未來新特性:靜態委託和函式指標C#函式指標
- Go1.18 新特性:棄用 strings.Title 方法,換個新坑吧!Go
- Java8新特性都到碗裡來Java
- Kotlin 1.5.20 釋出了~快來看看新特性Kotlin
- ES6中let 和 const 的新特性
- PHP7.4 新特性和廢棄的功能PHP
- ES6中的新特性:Iterables和iterators
- 帶你瞭解PHP7裡生成器的新特性PHP
- SEO帶來的不僅是流量,也帶來了品牌和口碑
- 為您的新Mac帶來最佳應用Mac
- Swagger3.0新版帶來的新變化Swagger
- 【Java8新特性】冰河帶你看盡Java8新特性,你想要的都在這兒了!!(文字有福利)Java
- Fedora 35 登場:帶來了 GNOME 41 和一個新的 KDE 變體
- Android 10.0 來了,居然有這新特性!Android
- Android Q:新系統名稱和新特性整理Android
- Java8 和 Java9 的主要新特性Java
- Go1.14 釋出了,快來圍觀新的特性啦Go
- 為專業開發者而來的 Power Platform 新特性Platform
- 智慧經營3.0如何帶來新的增長?
- 新特性
- Swift 4.1 的新特性Swift
- ES的那些新特性
- 玩轉iOS開發:iOS 11 新特性《Layout的新特性》iOS
- 第 80 期帶你提前玩 Go 2 新特性:泛型Go泛型
- 大咖帶你解讀 PostgreSQL 15 新特性 | 直播預告SQL
- 使用mybatis example 和 java 8的特性來實現多表關聯且帶有查詢條件的查詢MyBatisJava
- Laravel 8 正式釋出!來看看有哪些新特性Laravel
- 開源一週歲,MindSpore新特性巨量來襲