1. 程式人生 > >Xcode 10.1 新特性及解決的問題

Xcode 10.1 新特性及解決的問題

原文連結

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

參考連線

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