距離 Xcode 10.1 正式版釋出已經將近一個月了,我們今天重新來回顧一下 Xcode 10.1 的新特性,以及已解決的問題和存在的問題。
本文主要參考了《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 編譯器
已解決的問題
- 對 iOS 12.1 beta 2 中的
libunwind
庫進行修改,解決了在 iPhone XS 和 iPhone XS Max 上執行少部分 app 的問題。
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
方法現在可以自動滾動選單了。
參考連線
-
Xcode 10.1 Release Notes
developer.apple.com/documentati… -
Xcode 10 Release Notes
developer.apple.com/documentati…
注:本文翻譯內容如有描述不準確的地方,請參考上述英文原文。