Xcode 10.1 新特性及解決的問題
距離Xcode 10.1 正式版釋出已經將近一個月了,我們今天重新來回顧一下Xcode 10.1 的新特性,以及已解決的問題和存在的問題。
本文主要參考了ofollow,noindex">《Xcode 10.1 Release Notes》 進行整理,同時你也可以查閱《Xcode 10 Release Notes》 獲取更多關於 Xcode 10 的細節。
接下來我們將以新特性(New Features)、已解決的問題(Resolved Issues)、已知問題(Known Issues)等幾方面來介紹 Xcode 10.1 在各模組上的更新。
1. General / 通用
新特性
- 支援 arm64e 處理器架構(預覽版)
如果你想嘗試尚處於開發者預覽版的 arm64e,請在 Xcode 專案編輯器中選擇你的 iOS app 對應的 target,在 Build Settings 中找到 “Architectures” 設定項,選擇 “Other…” 選項,然後新增手動新增 arm64e 到 architectures 列表中。
注:目前 App Store 和 TestFlight 並不接受包含 arm64e 的提交,所以當我們 Archive 後在 Organizer 視窗要向蘋果提交發布時,Xcode 會自動移除掉 app 包中 arm64e 的內容。
已解決的問題
-
選單中 Navigate > Open in… 的導航欄 UI 不再將視窗中的各個 tabs 顯示為單獨的視窗,每個視窗都有一個 tab。
-
xed 工具現在使用由當前
xcode-select
或DEVELOPER_DIR
環境變數指定的 Xcode。
2. Apple Clang Compiler / 蘋果 Clang 編譯器
已解決的問題
3. Asset Catalog / 資源目錄
已知問題
- 專案中如果包含了 asset catalogs 並使用 Xcode 10.0 或者更高版本的構建的 app,且其 Deployment Target(指最低支援的系統版本)設為 iOS 9.0、9.1 或者 9.2 時,會生成與這些 iOS 版本的執行時不相容的內容(具體表現為:在系統版本為 9.0 ~ 9.2.1 之間的真機裝置上通過 App Store 或者 TestFlight 下載安裝該 app 並執行,會出現偶現的 Crash)。
注:關於這個問題,相信大家已經很熟悉了,網上有很多討論,我們之前也發了幾條相關的小集。它是在 Xcode 10.0 上開始出現的,而在 Xcode 10.1 剛釋出時,蘋果聲稱已經解決了,後面大家紛紛表示這個問題仍然存在。不過根據微博上的最新訊息和小夥伴們的親自驗證,蘋果已經在服務端解決了這個問題,開發者通過 Xcode 10.1 打的 ipa 包在上傳到 App Store Connect 後臺,蘋果在處理包的過程中會自動修復。
已解決的問題
- 增加 40mm 和 44mm 的孔(wells)用於解決指定正確的圖示大小的難題。
4. Build System / 構建系統
已解決的問題
-
新的構建系統支援“按需資源”(On Demand Resources,ODR)。
-
修復了問題:在為 .xib 檔案或 storyboards 使用基本本地化時,不會將與基本檔案關聯的各個本地化的 .xib 檔案或 storyboards 編譯到產品中。
5. Debugging / 除錯
新特性
- 對於異常斷點(Exception Breakpoints)的斷點編輯器增加了一個 “ignore count” 欄位。
6. Devices / 裝置
已解決的問題
- 執行 iOS 12 或更高版本的裝置從 “Devices” 視窗中請求獲取螢幕截圖的問題。
7. Interface Builder / 介面構建工具
新特性
- 現在,在畫布中拖動控制元件(Control-dragging)以新增約束總是包括所有四個方向,而不僅僅是最接近拖動方向的方向。
已解決的問題
-
修復了問題:在將檢視與
UIScrollView
的子檢視新增約束時, Auto Layout 會錯誤報告問題。 -
提高了畫布(canvas)的效能:當底部裝置欄在 iPhone XS、iPhone XS Max 和 iPhone XR 之間切換時。
-
修復了導致預覽助手編輯器(Preview assistant editor)中監視內容佈局與裝置欄選擇不匹配的問題。
-
現在,當啟用
@IBDesignable
檢視時,將使用新的構建系統進行編譯。
8. Simulator / 模擬器
已知問題
-
如果有另一個程序,例如
simctl
,在模擬器正在開啟時關閉了模擬的裝置,則模擬器在下次啟動裝置時無法正確地重新連線到模擬器。如果你安裝了多個版本的 Xcode,則在其他版本的 Xcode 中執行模擬器是可能也會遇到這個問題。
臨時解決方案: 退出並重新啟動模擬器。要在不關閉所有模擬器的情況下退出,請先按住 Option 鍵並選擇 Simulator > Quit Simulator…,然後在出現的對話方塊中選擇 “Keep Running”。
9. Swift Compiler / Swift 編譯器
已知問題
- 如果你在一個類的例項物件上通過使用 protocol 或 extension 中定義的 nonmutating setter 來間接修改屬性,則 Swift 編譯器可能會出現錯誤編譯:在呼叫該屬性的 getter 方法之後就直接釋放該例項物件。這可能會導致程式崩潰或在執行時出現不可預測的行為。
例如:
protocol SomeProtocol { } class SomeClass: SomeProtocol { } extension SomeProtocol { var someNonmutatingProperty: CGPoint { nonmutating set { _ = self } get { return .zero } } } // Might be miscompiled, deallocating SomeClass() too early. SomeClass().someNonmutatingProperty.x = 42
臨時解決方案: 將該操作分解為多個語句,以便 get 和 set 操作在不同的語句中發生:
let someObject = SomeClass() // First get the nonmutating property value. var temp = someObject.someNonmutatingProperty temp.x = 42 // Then modify it. someObject.someNonmutatingProperty = temp
已解決的問題
-
Xcode 中的 Playgrounds 不再記錄關於在執行時型別無法解碼的欄位的資訊。
-
現在編譯 Swift 程式碼時會始終報告導致任何失敗的錯誤。例如,之前可能會發生諸如 “Command CompileSwiftSources failed with a zeroo exit code” 之類的訊息,而沒有伴隨的失敗原因。
-
包含空格的長檔案路徑將不會再導致構建失敗。
-
NSBundle
類的bundleForClass:
初始化方法現在與 Swift 類保持一致,包括即使不在最新的作業系統版本上執行。 -
現在可以將以函式型別作為引數的泛型類的 “let property” 成功傳遞給另一個函式或方法。
class A<B> { let function: (B) -> B } func takeFunction(_: (Int) -> Int) {} func passFunction(from a: A<Int>) { takeFunction(a.function) }
-
對巢狀上下文中(nested context)的捕獲值所做的更改現在將反映在外部上下文中(outer context)。
-
現在可以成功呼叫一個在協議型別(protocol type)的值上返回 Self 的變異方法(mutating method):
protocol Example { mutating func test() -> Self } func foo(x: inout Example) { _ = x.test() // No longer crashes the compiler sometimes. }
- 編譯器現在可以成功地將一個異構類物件(heterogeneous class objects)陣列生成為 AnyObject 陣列:
func f(_: [AnyObject]) f([NSObject.self, NSString.self])
10. Swift Standard Library / Swift 標準庫
已解決的問題
-
FixedWidthInteger
協議中的unsafeAdding(_:)
,unsafeSubtracting(_:)
,unsafeDivided(by:)
, 以及unsafeMultiplied(by:)
等方法已棄用(deprecated),並將在以後的版本中刪除。
這些方法在溢位條件下會產生未定義的行為。因此在算術運算的情況下,可以使用assert
和addingReportingOverflow(_:)
方法或者&+
運算子的組合,這兩者都會在溢位的情況下有明確定義的結果。
11. Source Control / 程式碼控制管理
已解決的問題
- 當從 GitLab.com 或者 GitLab 自託管賬戶進行克隆(cloning)倉庫時,組織倉庫(organizational repositories)目前可以與個人倉庫(personal repositories)一起顯示了。
12. Testing / 測試
已知問題
- 當開啟並行化測試(test parallelization)時,效能分析測試(profiling tests)的結果不能正確地表現。
臨時解決方案: 當進行分析測試時可以通過如下方式禁用並行測試:在 Xcode 選單欄中開啟 Product > Scheme > Edit Scheme… > Test > Info,選擇測試 target 旁邊的 “Options” 按鈕,然後禁用 “Execute in parallet” 複選框。
已解決的問題
-
使用舊版構建系統(legacy build system)的專案中的 UI 測試,目前可支援在 iPhone XS 和 iPhone XS Max 上運行了。
-
如果一個 UI 測試的目標 app 在模擬器上進行測試期間崩潰了,則現在可以將其正確地報告為測試失敗,而不是像之前那樣被錯誤地視為成功測試,或者顯示有關 “Application state unknown” 失敗資訊。
-
Xcode 10.1 beta 2 及更高版本支援在執行 iOS 12 beta 版的裝置上進行 UI 測試。
-
修復瞭如果在測試已經開始後的任何時刻新增觀察者,則此時新增到
XCTestObservationCenter
共享例項物件上的觀察者的testBundleDidFinish:
方法不會被呼叫的問題(例如:在所有當前註冊的觀察者上呼叫了testBundleWillStart:
方法之後)。 -
當接收器(receiver)是一個選單項或者選單項的子檢視時,
XCUIElement
類的click
和hover
方法現在可以自動滾動選單了。