Xcode 11.4 新特性概覽

->· 2020-03-25
本文來自 知識小集 ,作者 ->

Xcode 11.4 發布,添加了不少新特性,同時也修改了原有的一些 BUG。本文依據官方文檔 Xcode 11.4 Release Notes,將其中的新特性提取出來,如果需要了解修復的問題,可直接查看文檔。

Xcode 11.4 包含適用于 iOS 13.4,iPadOS 13.4,tvOS 13.4,watchOS 6.2 和 macOS Catalina 10.15.4 的SDK。Xcode 11.4 版本支持在 iOS 8+,tvOS 9+ 以及 watchOS 2+ 的設備上調試,同時需要運行 macOS Catalina 10.15.2+ 版本的 Mac。

通用

? Xcode 11.4 可以構建和分發支持 通用購買 的 macOS 應用。要將 macOS 應用以通用購買形式進行分發,請在創建新項目時在 Xcode 模板助手中指定與 iOS 應用相同的 bundle id。如果您有現有項目,請在“Project Editor”中編輯其 bundle id。

? 在 Xcode 11.4 中創建的新 Mac Catalyst 應用程序時,默認啟用通用購買。創建新的 Mac Catalyst 應用程序時,將使用與 iOS 應用程序相同的 bundle id。

? Xcode 11.4 中的自動簽名支持使用自定義 bundle id 構建 Mac Catalyst 應用。您可以在 Project Editor -> Signing & Capabilities選項卡中編輯應用程序的 bundle id。如果選擇使用與 iOS 應用程序不匹配的自定義 bundle id 來構建 Mac Catalyst 應用程序,則將無法以通用購買的形式分發該應用程序。

Apple Clang 編譯器

? Xcode 11.4 默認打開 -Watimport-in-framework-header 警告。不建議在框架頭文件中使用 @import ,因為這樣做需要所有導入程序都使用模塊。

要臨時消除此警告,請使用:

#if __has_feature(modules)
#if __has_warning("-Watimport-in-framework-header")
#pragma clang diagnostic ignored "-Watimport-in-framework-header"
#endif
@import NameOfFramework;
#endif

構建系統

? 構建設置有一個新的操作符 default,如果構建設置表達式在其上下文中計算為空,則可以使用該運算符指定構建設置的默認值。例如:

$(SETTING:default=something)

如果 $(SETTING) 為空,則此表達式的計算結果為“something”。默認值本身可以是包含構建設置的表達式。(57402718)

? 現在,要使用新的構建系統構建無代碼內核擴展,就需要將 GENERATE_KERNEL_MODULE_INFO_FILE 構建設置設置為 NO。(57247534)

調試

? 視圖調試器現在提供布局指南(UILayoutGuide,NSLayoutGuide)及其引用約束。

? 視圖調試支持使用“Editor”菜單中的“Show Layers”菜單項顯示圖層。

? 現在,異常原因作為編輯器注釋出現。您可以在“Variables View”中檢查 Exception 對象,并在 Debug Navigator 中找到原始未捕獲異常的回溯(如果有)。

? 現在,您可以將 Terminal 用于標準 I/O,以取代 Xcode 的控制臺。在 Scheme Editor 的 Options 標簽中選擇。

Interface Builder

? 為 inspector 顏色選擇器添加了動態系統灰色。

Metal

? Metal Frame Debugger 現在支持 iOS 和 tvOS 模擬器。

Organizer

? Crashes Organizer 顯示了通用購買 macOS 應用程序的崩潰日志。

預覽

? 可以直接在 Xcode Previews 畫布中復制,剪切,粘貼,復制和刪除視圖。

? 在代碼中選擇 SwiftUI 預覽將在畫布中突出顯示相應的預覽,反之亦然。

? Xcode Previews 現在支持預覽轉換到 Mac 的 iPad 應用程序。

模擬器

? 拖放 SSL 證書(CER或PEM文件)會將證書安裝到模擬設備的受信任根存儲中。

? simctl 支持鑰匙串子命令。此命令可以將證書添加到受信任的根存儲或鑰匙串。它還可以重置鑰匙串,刪除所有保存的項目。例如,將 my-selfsigned.cer 安裝到受信任的根存儲中:

$ xcrun simctl keychain <device> add-root-cert my-selfsigned.cer

將證書添加到受信任的根存儲中會創建 TLS/SSL 連接來信任該證書。

simctl 現在支持修改隱私權限。您可以修改隱私權限以創建已知狀態來進行測試。例如,要允許示例應用程序在沒有任何提示的情況下訪問照片庫:

xcrun simctl privacy <device> grant photos com.example.app

要將所有權限重置為默認值,就像以前從未安裝過該應用程序一樣:

xcrun simctl privacy <device> reset all com.example.app

重置權限后,請測試您的應用程序,以確保您在 Info.plist 中具有正確的使用描述鍵,并且可以正確地請求和處理不同的授權狀態。有關更多信息,請參考 xcrun simctl help privacy 。

? 模擬器支持 iOS 模擬器(13.0及更高版本)切換外觀。在應用程序中,選擇 Debug > Toggle Appearance。在命令行中使用 simctl ui 子命令,例如設置深色外觀(54556446)(FB7093020):

$ xcrun simctl ui <device> appearance dark

? Simulator 現在有一個菜單項和鍵盤快捷鍵,可在 iOS Simulators 中調出應用程序切換器。

simctl status_bar 現在允許更改操作符名稱。

? 模擬器現在有一個可在iOS模擬器中觸發屏幕截圖的菜單項。這樣會將屏幕截圖保存到模擬設備的相機中。為了清晰起見,現有的屏幕截圖功能已重命名為 Save Screen,并且默認情況下會繼續將設備的幀緩沖保存到 Mac 桌面。保存屏幕時按住 Option 鍵可更改默認位置。

? tvOS 模擬器不再像與 Mac 配對的 Siri Remote 一樣捕獲 TouchBar。

? Simulator 支持模擬遠程推送通知,包括后臺內容獲取通知。在模擬器中,將 APNs 文件拖放到目標模擬器上。該文件必須是帶有 Apple Push Notification Service 有效負載(包括“aps”鍵)的 JSON 文件。它還必須包含一個頂級 Simulator Target Bundle,其字符串值必須與目標應用程序的 bundle id 相匹配。

simctl 也支持發送模擬的推送通知。如果文件包含 Simulator Target Bundle ,則不需要 bundle id,否則,必須將其作為參數提供:

$ xcrun simctl push <device> com.example.my-app ExamplePush.apns

? Simulator 具有一個新的 UI,可簡化與模擬設備的協作。模擬設備窗口有標準標題欄,帶有用于執行常規任務的按鈕。應用程序級設置現在在 Preferences 窗口中可用。

源碼控制

? 改進了核心源碼控制功能的穩定性,并減少了與內存占用量有關的問題。

? 將“Fetch and Refresh Status”菜單項的功能拆分為兩個單獨的菜單項,以分離獲取和刷新狀態。

Swift Packages

? 使用 5.2+ 工具的 Remote Swift 軟件包不再解析僅在其測試目標中使用的軟件包依賴關系,從而提高了性能并減少了依賴版本沖突的可能性。

? Swift 包管理器使用一種新策略來解決包依賴問題,從而顯著提高了錯誤消息的質量和復雜包依賴中的性能。

Swift

? 您可以像調用函數一樣調用實現了 callAsFunction 方法的類型。調用語法是應用 func callAsFunction  方法的簡寫。

struct Adder {
   var base: Int

   func callAsFunction(_ x: Int) -> Int {
     return x + base
   }
}

var adder = Adder(base: 3)
adder(10) // returns 13, same as adder.callAsFunction(10)

您必須在調用位置包含 func callAsFunction 參數標簽。您可以在單個類型上添加多個 func callAsFunction 方法,并且可以將它們標記為 mutating。func callAsFunction 可用與 throws 和 rethrows 以及尾隨閉包一起使用。

? 下標現在可以聲明默認參數。

struct Subscriptable {
   subscript(x: Int, y: Int = 0) {
     ...
   }
}

let s = Subscriptable()
print(s[0])

? 類約束的協議擴展(其中擴展協議未施加類約束)現在可以隱式推斷該約束。

protocol Foo {}
class Bar: Foo {
   var someProperty: Int = 0
}

// Even though 'Foo' does not impose a class constraint, it is automatically
// inferred due to the Self: Bar constraint.
extension Foo where Self: Bar {
   var anotherProperty: Int {
       get { return someProperty }
       // As a result, the setter is now implicitly nonmutating, just like it would
       // be if 'Foo' had a class constraint.
       set { someProperty = newValue }
   }
}

? 現在,在定義基類的模塊外部定義的子類的便捷初始化構造器有附加的限制。當這些子類繼承自帶有非公開(non-public)指定初始化器的基類時,它們將不再從其超類中自動繼承便捷初始化器。為了恢復這種自動繼承行為,基類必須確保其所有指定的初始化器訪問限制是 public 或 open。

? Xcode 和相應的 Command Line Tools 包包含用于 Swift 和 C 語言的 SourceKit-LSP 語言服務器。語言服務器尚處于早期開發階段,這是嘗試它的好時機。SourceKit-LSP 可以與支持語言服務器協議(LSP)的第三方工具一起使用,并且它支持從命令行構建的 Swift 軟件包。有關使用 SourceKit-LSP 的信息,請參閱 Getting Started with SourceKit-LSP。

? Swift 編譯器使用一種新策略來產生診斷,從而大大提高錯誤消息的質量和準確性。有關此新策略的詳細信息,請參見 New Diagnostic Architecture Overview 。

? 如果基類方法沒有強制要求,則子類在重寫時不能為泛型參數附加約束。例如,以下代碼會產生錯誤。(23626260)(FB5382462)

protocol P {}
     
class Base {
   func foo<T>(arg: T) {}
}
     
class Derived: Base {
   // generates an error because of the added requirement
   override func foo<T: P>(arg: T) {}
}

測試

? 要從 xcodebuild 啟用測試超時行為,或覆蓋測試計劃中的相應設置,請傳遞 -test-timeouts-enabled 選項。要在啟用超時后為單個測試配置默認執行時間,請傳遞 -default-test-execution-time-allowance 選項。要對測試的運行時間強加絕對上限(如果它通過executeTimeAllowance API請求更多時間),請傳遞 -maximum-test-execution-time-allowance 選項。有關更多信息,請參考 xcodebuild 手冊頁(man xcodebuild)。

? 可以通過測試計劃中的 Test Timeouts 選項啟用測試超時??梢栽诿钚兄型ㄟ^ xcodebuild 的 -test-timeouts-enabled 選項覆蓋此值。

? XCTAssertEqualWithAccuracy 和 XCTAssnotNotEqualWithAccuracy API 現在支持所有 FloatingPoint 類型。

? 當構建已轉換為使用測試計劃且其測試計劃已啟用代碼覆蓋率的方案時,Xcode 現在在為“Run”操作和“Test”操作構建時還包括代碼覆蓋率檢測。這與不使用測試計劃且啟用了代碼覆蓋率的構建方案的行為相符,并且避免了在運行和測試操作之間交替進行時不必要的重建。

? UI 測試上下文支持重置受保護資源(例如,聯系人,藍牙或位置)的授權狀態。XCUIApplication 多了一個新方法 resetAuthorizationStatus(for:),該方法接受一個 XCUIProtectedResource。這使測試者可以輕松地將應用的授權狀態設置為其初始狀態,從而提供一種方便的方法來測試其資源的首次啟動/首次訪問流程。

? Swift 中用于 XCTest 的 Xcode 的新文件模板在所有測試方法中包含了 throws 關鍵字。測試方法引發的錯誤標記為測試失敗。

? 如果您在活動方案/測試計劃中為測試目標啟用并行測試,并且將 -parallelize-tests-among-destinations 標志與多個目標指定符一起傳遞給 xcodebuild,則 Xcode 會在目標之間分配 target 的測試類以加快速度測試。

? 在 macOS 上進行的 UI 測試和記錄支持 Fn 鍵修飾符。

? 當您為使用測試計劃的方案運行 xcodebuild xcodebuild build-for-testing 時,其生成的 .xctestrun 文件現在包含有關每個測試計劃的元數據,包括測試計劃的名稱以及該計劃是否是默認計劃。

? 通過引入“Enable Testing Search Paths”構建設置,Xcode 現在對測試支持框架和庫提供了更好的支持。對于測試包目標以及在其“Link Binary With Libraries”列表中明確包含 XCTest.framework 的目標,默認情況下此構建設置為啟用?,F在,此類目標中的源文件可以導入 XCTest,而無需設置任何自定義搜索路徑。

? 對于自定義 XCTestObservation 實現引發異常的情況,XCTest 改進了錯誤處理和日志記錄。

? 現在,當使用 -xctestrun 標志運行 xcodebuild test-without-build 時,xcodebuild 現在可以驗證已構建產品的部署目標和體系結構。與請求的運行目標不兼容的目標將被忽略。

? XCTest 現在包括 setUp() 和 tearDown() 實例方法的 throwing 變體,從而允許測試在設置或拆卸期間在 Swift 中拋出錯誤。分別重寫 setUpWithError() 或 tearDownWithError() 方法,以取代 setUp() 或 tearDown() 方法。如果 setUpWithError() 引發錯誤,則不執行測試方法,并且如果該錯誤是由于調用 XCTSkip* API 引起的,則該測試將標記為已跳過而不是失敗。

? Xcode 現在驗證測試包目標的部署目標,并跳過與所選運行目標不兼容的所有測試。某些目標可能需要更改其最低部署目標構建設置,才能繼續在較舊的運行目標上運行。

? Swift 測試方法拋出的錯誤現在記錄了錯誤的源位置。Xcode 在源代碼編輯器中突出顯示了這些行,并允許從“Issue Navigator”跳轉到這些位置。

? 現在,通過單擊“Test Navigator”中的“+”按鈕,Xcode 現在可以在源代碼編輯器中打開文件。

? XCTest 現在支持根據運行時條件動態跳過測試,例如僅在某些設備類型上運行或可訪問遠程服務器時才執行某些測試。跳過測試時,Xcode在“Test Navigator”和“Test Report”中以不同的方式顯示它,并突出顯示發生跳過的代碼行以及可選的用戶描述。有關跳過的測試的信息也包含在 .xcresult 中。

要跳過測試,請從測試方法或 setUp() 中調用新的 XCTSkip * 函數之一。例如:

func test_canAuthenticate() throws {
   XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")

   // Perform test…
}

XCTSkipUnless(_:_:file:line:) API類似于 XCTSkipIf(_:_:file:line:)  API,但是如果提供的表達式為 false 而不是 true,則會跳過,同時可以使用 XCTSkip API 無條件跳過。

? 現在,如果測試超過了配置的持續時間,XCTest 允許各個測試超時。如果通過測試計劃選項或 xcodebuild 命令行選項啟用了超時,則將為每個測試提供默認的余量,必須在此時間范圍內完成測試。超過此時間長度的測試將失敗,并且測試過程的轉儲將附加到測試報告中的相應的測試信息中。如果測試需要額外的時間來運行,則可以通過 XCTestCase 上的 executionTimeAllowance 屬性進行請求。有關更多信息,請參考 XCTestCase.h 中的文檔。

湖北11选5开奖号