原文:http://www.jianshu.com/p/c1904fd8db06
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上還可以選擇是否分屏,功能非常強大。
在右邊有一個Vary for Traits
選項,點擊這個選項就可以同時顯示所有可選的屏幕樣式,功能和上面圖片都一樣,只是顯示上看起來比較多。
還有一點,新創建的XIB
控件尺寸,不再是之前600*600的方塊了,而是默認是6s的長方形XIB
文件,看起來舒服多了。
Target中General的變化
在Xcode8
之前,都需要自己設置證書和描述文件。如果設置出現錯誤的情況下,還可以通過點擊Fix issue
來修復這個錯誤。但這有個問題就在於,Fix issue
選項並不是那麼好用,有的時候設置是正確的這裏也提示需要Fix issue
。
可能蘋果也意識到這個問題的存在,在Xcode8
中可以通過Automatically manage signing
選項,讓蘋果爲我們管理證書和配置文件,設置也都是由蘋果來完成的。在Xcode8
中新建項目,這個選項默認是被勾選的。
從上面圖中可以看到,蘋果幫我們自動管理了證書和配置文件。而且在之前的項目中,如果想要設置安裝後顯示在手機上的App
名字,還需要自己到Info.plist
文件中,修改Display Name
字段,而現在直接在General
中就可以做修改,這個修改和Info.plist
是同步的。
但是,如果我想自己管理證書和描述文件呢?只需要去掉Automatically manage signing
選項。
如果自己到Build Settings
中手動設置證書和描述文件,可以發現Provisioning Profile
選項已經被標明爲Deprecated,也就是蘋果並不推薦手動設置。
Xcode插件
升級Xcode8
之後會發現,在Xcode8
中所有第三方插件都失效了,並且連之前菜單欄的插件選項也不存在了。在之前很多iOS開發者,都是通過Alcatraz來管理插件的,現在Alcatraz也是不可用的。但是Xcode8
自身也對編譯器進行了升級,將一些比較好的插件功能加入到Xcode
中,例如單行高亮顯示等。
在Xcode8
中支持了開發插件工程,並且爲我們提供了一個插件模板,開發的插件可以上傳到App Store下載。蘋果這麼做有一個原因在於,之前Xcode
和插件是運行在同一個進程的,所以插件的崩潰也會導致Xcode
崩潰。蘋果現在將插件作爲一個單獨的應用程序,分開進程運行,不會對Xcode
帶來其他影響。
Runtime Issues
在開發過程中,因爲語法或明顯的代碼錯誤(例如Retain Cycle
),編譯器可以發現並報黃色或紅色警告。但是一些因爲代碼邏輯導致的錯誤,編譯器並沒有辦法找到。例如下面的這句代碼,因爲代碼邏輯的問題導致兩個數組相互引用,都不能釋放。
這時候可以通過Xcode8
提供的Runtime Issues
新特性,查找到運行過程中出現的問題,並通過Graph的方式將問題可視化的展現給開發者。
Debug Memory Graph
在Xcode6
中出現了Debug View Hierarchy
新特性,可以通過其調試當前App
的視圖層級,查找UI相關的bug
非常方便。在Xcode8
中蘋果爲開發者提供了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
。
其他更新
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即可。
但是這樣有個問題,如果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後,會發現打包後蘋果發來了一封郵件。這封郵件大概意思是如果需要使用推送通知,需要對代碼做修改,否則將不能使用推送通知。
這是因爲在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即可。
順便提一下,這兩天在設置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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。