Xcode 10.1 新特性及解決的問題

知識小集發表於2019-03-04

原文連結

距離 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-selectDEVELOPER_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),並將在以後的版本中刪除。

這些方法在溢位條件下會產生未定義的行為。因此在算術運算的情況下,可以使用 assertaddingReportingOverflow(_:) 方法或者 &+ 運算子的組合,這兩者都會在溢位的情況下有明確定義的結果。

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 類的 clickhover 方法現在可以自動滾動選單了。

參考連線

注:本文翻譯內容如有描述不準確的地方,請參考上述英文原文。

相關文章