Xcode 11 的那些新东西

21,465 阅读28分钟

原文链接

更多好文,请关注公众号 知识小集 (ID: zsxjtip)

Xcode 11 正式版比预期晚来了一点,不过没关系,Release Note 文档比 beta 版的文档改动不大。我们翻译(部分)整理了一下,发出来供大家参考。内容很多,有些地方翻译也不到位,所以建议收藏并对照英文慢慢看。

如果内容上有问题,可以在留言区留言指出,这样大家都可以看到问题,在此感谢。

General

• Xcode 11 支持使用 SwiftUI 进行开发

注意

仅在 macOS Catalina 10.15 上运行 Xcode 时,SwiftUI 预览和检查器才可用。

• Xcode 11 增加了对 Mac Catalyst 的支持,Mac Catalyst 可将 iPad 应用程序带入 Mac。

注意

仅在 macOS Catalina 10.15 上运行 Xcode 时,iPad 应用程序才能配置成为 Mac 构建,并且在早期版本的 macOS 上无法运行 My Mac。

• 现在可以独立于系统外观设置更改 Xcode 的外观。

• Xcode 支持从 Organizer 窗口或在命令行中使用 xcodebuild 或 xcrun altool 上传应用程序。Xcode 不再包含 Application Loader。

• macOS 上的 LaunchServices 在启动 Xcode 中嵌入的Instruments、Simulator 等工具时会遵从所选的 Xcode。例如,双击 Finder 中的 Instruments 时,将启动所选 Xcode 对应的 Instruments 版本。

Apple Clang 编译器

• Clang 现在提供了一种控制退出时析构函数注册的机制。您可以使用标志 -fno-c++-static-destructors 全局禁用它们,或者应用属性 [[clang::no_destroy]] 来禁用特定变量的析构函数。当使用 -fno-c++-static-destructors 时,还添加了属性 [[clang::always_destroy]] 以启用特定变量的析构函数。

• 作为扩展,现在所有语言模式都支持具有固定基础类型的 C++ 11 枚举。

• 默认情况下,在所有平台上都启用堆栈检查以防止内存问题。

• 机器代码的 outline 默认是 -Oz。它通过识别跨函数的相同代码序列来减少代码大小。这些序列在单个编译器生成的函数中被封装(“outlined”)。每个原始代码序列都被替换为调用该 outlined 函数。

• 为了提高性能和安全性,静态链接器(ld)现在将标记为常量的全局变量移动到新段中:__DATA_CONST。这些全局变量可能包含编译器生成的指针,动态链接器(dyld)在加载期间需要修复这些指针,但是在其他情况下是常量的,例如 vtable 和显式声明的常量指针。一旦 dyld 完成加载 image,它就会设置 __DATA_CONST 为只读。此更改不会影响性能良好的代码,但可能会破坏依赖于未定义行为的代码,例如使用一个类型来写入声明为 const 的指针。

static int value1 = 0; //存储在__DATA中
static int value2 = 0; //存储在__DATA中
const int * const valuePtr =&value1; //存储在__DATA_CONST中

// ERROR: Attempting to store a value to a constant pointer
(int *)valuePtr =&value2;

• Clang 现在支持适用于 iOS 13,macOS 10.15,watchOS 6 和 tvOS 13 的 C++17 <filesystem> 库。

解决的问题

• 移除了 <experimental/optional><experimental/variant>。请改用 C++17 中的 <optional><variant>

Asset Catalog

• Xcode 可以使用 “Find” 导航器在工作区/项目中查找 assets。Asset Catalog Editor 还支持查找和替换,您可以使用 Replace 重命名 assets。

• 现在可以使用菜单或键盘快捷键剪切,复制,粘贴和复制 assets。

已解决的问题

修复了在 iOS 11 上在运行时无法找到 named colors 的 Asset Catalog 错误。

构建系统

• Xcode 默认使用响应文件将输入文件传递给 Swift 编译器。要关闭此行为,请将 USE_SWIFT_RESPONSE_FILE 设置为 NO。

• 运行脚本阶段和自定义构建规则可以在一些编译器和构建工具使用的 Makefile-style 的 .d 格式输出中声明和发出依赖项文件。在确定是否应执行规则或阶段时,构建系统会在后续构建期间检查列出的更改文件。

• 现在,项目可以通过将“Process Header Files”(APPLY_RULES_IN_COPY_HEADERS)构建设置设置为 YES 来使用自定义构建规则。

• 自定义构建规则现在可以指定在执行期间使用的其他静态输入文件。使用 SCRIPT_INPUT_FILE_# 环境变量将这些已解析的输入文件路径提供给规则脚本。

如果条目不适合正在构建的平台,Xcode 会在构建时从应用的 Info.plist 文件中删除一些条目,这对于配置为多个平台构建的目标非常有用。通过将构建设置 DISABLE_INFOPLIST_PLATFORM_PROCESSING 设置为 YES 可以禁用此行为,在这种情况下,target 必须承担相应管理这些条目的责任。

• 自定义构建规则现在可以声明它们应该在每个 architecture 中运行一次(默认),或者在所有 architecture 中只运行一次。这对于体系结构中立的自定义规则很有用,例如,生成每个体系结构不同的文件的代码生成工具。

• XCFramework 可以将多个平台(包括iOS设备,iOS模拟器和Mac Catalyst)的二进制框架或库捆绑到一个可分发的 .xcframework 包中,开发人员可以在自己的应用程序中使用它。可以将 .xcframework 包添加到 Xcode 目标的链接库阶段,Xcode 在构建时使用所包含的框架或库的正确平台版本。使用 xcodebuild -create-xcframework 从命令行创建框架。应该在 Build Libraries for Distribution 构建设置为 YES 的情况下构建 XCFramework 中捆绑的框架或库。

已解决的问题

• 默认情况下,Xcode 的新构建系统不会检测声明为 shell 脚本构建阶段输入的目录中的更改。启用构建设置 USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES 会使其执行此操作。但是,如果此类目录中的任何文件是由依赖于脚本阶段输出的任务生成的,则会产生依赖循环错误,必须通过重构目标来解决。

命令行 Tools

弃用

• Xcode 的内置的 usdz_converter 工具已弃用,将被删除。使用位于 Augmented Reality 中的资源下的新的工具套件。

• Subversion 的命令行支持将在以后的版本中删除。

Core Data

• 现在有一个复选框,可以区分字符串属性的默认值是 nil 还是空字符串。设置时,如果未指定其他默认值,则默认值为空字符串。

• Xcode 11 数据模型文件格式不再写出或保留实体或属性的弃用的 Sync Services 信息。

• 在使用 Xcode 11 数据模型文件格式和适当的部署目标时,Core Data 数据模型编辑器添加了对派生属性的支持。

• 使用 Core Data 创建应用程序时,还有一个新的复选框,可以为数据模型的默认配置启用 CloudKit 支持。也可以使用新配置检查器为现有数据模型启用此功能。当数据模型配置支持 CloudKit 时,数据模型编辑器会执行其他验证,以确保模型符合 Core Data CloudKit 支持的要求。

已解决的问题

• 使用 UUID 属性类型、URI 属性类型或持久历史记录功能在与 Xcode 9 中使用的格式的数据模型文件格式一起使用时生成错误。

Create ML

• 您现在可以使用 Sound Classification 预览直接从麦克风对声音进行分类。

• 现在提供 Tabular Regressor 模板,加入了 Image Classification, Sound Classification, Activity Classification, Tabular Classification, Word Tagger 和 Text Classification。

已解决的问题

• 非 ASCII 字符可用作 Image Classification 和 Sound Classification 的训练标签。

调试

• 视图调试器现在在检查器中显示 NSImage 实例的名称。

• 用于调试视图层次结构的 Size inspector 中的图形过滤器会标识所选视图上的哪些属性受到约束。在过滤器中选择属性会将显示的约束缩小为与该属性匹配的约束。可以使用 Shift 和 Command 等标准键来扩展选择,显示与这些属性匹配的约束的并集。

• 现在可以调试 watchOS 应用程序的视图层次结构。

• 现在可以从 Devices and Simulators 窗口模拟连接设备的网络状况和 thermal 状态。

• 视图调试器在调试导航器和画布中显示 UIWindowScene 实例。

• 可以在 scheme 选项中禁用视图调试。

• 用于调试视图层次结构的 Size inspector 包含有关约束的更多详细信息,包括过滤器,编辑器中的悬停突出显示以及更好的描述。

• 视图调试器支持调试 Mac Catalyst 应用程序。

• 视图调试器检查器显示 NSImageView 和 NSButton 的contentTintColor。

• 视图调试器现在显示 iOS 命名颜色和系统颜色的名称。

• 视图调试器显示特征集合信息。

• 视图调试器显示 UIImage 实例的名称。

• 视图调试器现在显示符号信息,如基线和中线。

• 调试栏外观切换器支持在iOS上更改暗和亮模式。

• Scheme Editor 的 Diagnostics 选项卡中的 Pause on issues 复选框将替换为常规断点。您可以使用断点导航器创建 Runtime Issue Breakpoint。

• 使用可从调试栏访问的 Environment Overrides 覆盖调试进程的外观,动态类型和可访问性选项等系统设置。

• 调试器支持使用崩溃日志(.crash文件)。

• 调试器可以调试 tvOS Top Shelf 扩展。

• 在安装或调试应用程序时,Xcode 可能更喜欢使用 Wi-Fi 连接到 Watch。 (50313856)

注意

iPhone-Watch 对必须位于相同的 2.4 GHz 网络上。无法使用不允许 peer-to-peer 的网络。

• 断点的 VoiceOver 操作菜单包括跳转到相应代码行的操作。

• 使用约束调试视图时,双击 size inspector 中的约束会在编辑器中选择该约束,并在检查器中显示约束的信息。

LLDB 的 Python 脚本现在基于 Python 3。如果您使用的 Python 扩展与 Python 3 不兼容,它们将会中断。为了帮助完成转换,您可以通过设置默认值来运行 Python 2 模式:

defaults write com.apple.dt.lldb DefaultPythonVersion 2

将在未来删除对 Python 2 的支持。

• Swift NSDecimal 值在 LLDB 中有一个数据格式化程序,使它们以可读的方式显示。

弃用

• iOS SDK 中不再包含 WatchKit framework。如果您使用的是 iOS 中的 WatchKit API,则需要删除此类操作。watchOS 上仍然提供 WatchKit 框架。

• 脚本语言运行时(如Python,Ruby和Perl)包含在 macOS 中,以与旧版软件兼容。在 macOS 的未来版本中,默认情况下,脚本语言运行时将不可用,并且可能需要您安装其他软件包。如果您的软件依赖于脚本语言,建议您在应用程序中捆绑运行时。

• 不建议使用 Python 2.7。此版本包含在 macOS 中,以与旧版软件兼容。未来版本的 macOS 将不包括 Python 2.7。相反,建议您在终端中运行python3。

• 从 macOS 10.15 开始,Quartz Composer 框架被标记为已弃用,但出于兼容性目的仍然存在。如果您的应用使用 Quartz Composer,请转换到 Core Image,SceneKit 或 Metal 等框架。

Instruments

• Instruments 现在允许一次从表中复制多行。

• Instruments 允许创建范围,以便在跟踪文档中更轻松地导航。

• Custom Instruments 中提供了 <os-signpost-point-schema> 来匹配来自 os_signpost(_:dso:log:name:signpostID:) 的事件。

Interface Builder

• Interface Builder 支持 iOS 13 UIVisualEffectView 模糊和 vibrancy 视觉效果。

• Interface Builder 支持iOS 13 UIActivityIndi​​catorView 样式。

• iOS 家用指示灯颜色现在适应浅色和深色 canvas 外观。

• Interface Builder 支持自定义 UIButton 符号配置。

• Interface Builder 支持 Apple TV 上的新布局TVCollectionViewFullScreenLayout。

• UIViewController 实例现在默认为 Automatic modal 演示模式。模态演示 segues 可以覆盖此设置。

• Interface Builder 支持 iOS 上的 Dark Mode。

• Interface Builder 的设备栏可让您在 iOS 应用程序的浅色和深色外观之间切换。

• 您可以添加 SwiftUI 主控制器,例如 UIHostingController,以将故事板控制器流连接到管理 SwiftUI 视图层次结构的主控制器。您可以通过提供以编程方式设置控制器的 rootView 的自定义子类来填充 Interface Builder 中托管控制器的内容。

• 您还可以使用 Segue Action 设置 UIHostingController 或 NSHostingController 的根视图。

• 对象库现在与所选的系统范围外观匹配。

• NSStackView 检查器现在允许配置负间距。

• 在 macOS 10.15 上运行时可以使用 NSSwitch。

• UITableView 中的单元格现在可以使用画布中的自动布局约束视图自行调整大小。要选择现有表视图的行为,请为表视图估计的项目大小启用 Automatic 设置,为 Size inspector 中的“单元格高度”启用 Automatic

• NSView 和 UIView 在 Size inspector 中具有布局模式选项,以明确选择“translates autoresizing mask into constraints”。默认设置为 Automatic,这是现有行为。Automatic 意味着当视图受故事板或 .xib 文件中的约束影响时,“translates autoresizing mask into constraints”是 off 状态,但如果不受约束则是 on 状态。

• 使用 Add Missing Constraints 提高了自动布局约束生成的可靠性。

• UIScrollView 的内容可以在画布中滚动,一旦其子视图完全受到自动布局约束的约束。

• 现在,UICollectionView 中的单元格可以使用画布中的“自动布局”约束视图进行自我调整。要选择现有集合视图的行为,请为集合视图的估计大小启用 Automatic 设置,并从 Size inspector 启用单元格大小的 Automatic 设置。如果在 iOS 13 之前部署,则可以通过在 viewDidLoad 期间调用 performBatchUpdates:completion: 来激活自调整大小的集合视图单元格。

• 在检查器字体弹出框中,Family 弹出窗口现在将菜单项呈现为适用字体的预览。

• 现在可以在文档范围内对错放的帧执行 Update Frames 操作,而无需选择视图。

• UIScrollView 支持内容和框架布局指南,可以在 Size inspector 中启用,以便更好地控制可滚动内容。

• Interface Builder 支持新的 Apple TV tab 栏样式。

• 新的 WKInterfaceTextField 接口元素可用于 watchOS。

• canvas 支持为 Mac Catalyst 应用程序定制界面。

• SF 符号在图像检查器属性中可用。

• UIImageView 检查器包括对配置符号的支持。

• 使用新的 @IBSegueAction 属性注释的视图控制器方法可用于在代码中创建segue的目标视图控制器,使用具有任何所需值的自定义初始化程序。这使得可以在故事板中使用具有非可选初始化要求的视图控制器。在源视图控制器上创建从 segu e到 @IBSegueAction 方法的连接。在支持 Segue Actions 的新操作系统版本上,将调用该方法,它返回的值将是传递给 prepareForSegue:sender: 的 segue 对象的destinationViewController。可以在单个源视图控制器上定义多个 @IBSegueAction 方法,这可以减少在 prepareForSegue:sender: 中检查 segue 标识符字符串的需要。

IBSegueAction 方法最多需要三个参数:coder、sender 和 segue 的标识符。第一个参数是必需的,如果需要,可以从方法的签名中省略其他参数。必须将 NSCoder 传递到目标视图控制器的初始化程序,以确保使用故事板中配置的值自定义 NSCoder。该方法返回一个视图控制器,该视图控制器与故事板中定义的目标控制器类型匹配,或者返回 nil,以使用标准 init(coder:) 方法初始化目标控制器。如果您知道不需要返回 nil,则返回类型可以是 non-optional 的。

在 Swift 中,添加 @IBSegueAction 属性:

@IBSegueAction
func makeDogController(coder: NSCoder, sender: Any?, segueIdentifier: String?) -> ViewController? {
    PetController(
        coder: coder,
        petName:  self.selectedPetName, type: .dog
    )
}

在 Objective-C 中,在返回类型前面添加 IBSegueAction:

- (IBSegueAction ViewController *)makeDogController:(NSCoder *)coder
               sender:(id)sender
      segueIdentifier:(NSString *)segueIdentifier
{
   return [PetController initWithCoder:coder
                               petName:self.selectedPetName
                                  type:@"dog"];
}

已解决的问题

• Connect-to-source popover 字段支持剪切,复制,粘贴和全选。

• 在设计或运行 macOS 时,更正了UILabel,UITextField 和 UITextView 实例的对齐,并在 Interface Builder 中将对齐设置为“center”或“right”。

• UIDatePicker 的检查器现在仅显示适用于所选模式的属性。

• 用于添加 iOS 设备的预览编辑器菜单现在与当前画布方向匹配。

• 预览编辑器项目现在保留配置的区域设置或伪语言设置。

• 在 Interface Builder 中配置为 Count Down 的 UIDatePicker 对象现在在运行时使用指定的 duration。

• 在不使用自动布局的文档中也可以看到 Embed In 按钮。

• NSControl 的子类现在在库和文档大纲中具有唯一的图标。

• 修复了在 iOS 13.0 之前设置为部署的 XIB 文件中的系统颜色在运行时无法适应系统外观的问题。

本地化

• 现在可以在 asset catalogs 中本地化资源。在属性检查器中启用了本地化。

• 设置包现在包含在 Xcode Localization Catalogs 中。

• genstrings的手册页更详细地记录了它的行为。

• genstrings 工具已增强并与 extractLocStrings 工具合并。以前的版本已弃用,已重命名为 ogenstrings,现在必须使用 xcrun 调用。任何调用 xcrun extractLocStrings 的脚本都应该更改为使用 genstrings,但是当前提供了一个调用 genstrings 的兼容性符号链接。

• genstrings 工具现在采用 -encoding 参数,允许指定输入文件的文件编码。

• genstrings 的更新版本改进了错误报告,并可能报告以前默默接受的方案中的错误。例如,如果 MyApp 目录包含子目录,则 genstrings MyApp/* 将失败,因为 genstrings 文件参数必须是源文件。

• genstrings 工具现在可以使用任意数量的 -s 参数来指定类似于 NSLocalizedString 的其他宏或从中提取字符串的函数。例如,genstrings -s MyErrorSring -s MyUIString myfile.swift 将 MyErrorString 和 MyUIString 视为等效于 NSLocalizedString。

注意

使用 -s 参数不会抑制对 NSLocalizedString 或 CFCopyLocalizedString 的支持。

• Export for Localization 命令和 genstrings 工具现在支持多行 Swift 和 Objective-C 字符串,并在识别 NSLocalizedString 的参数时放宽了空格要求。

• Export for Localization 命令的性能得到了显着改善。

Organizer

• 新的 Metrics organizer 显示您的应用程序的电池寿命和性能分析,以帮助您推动优化。在 App Store 上分发并经过充分的现场使用后,会为您的应用报告指标。可用的指标包括电池消耗,启动时间,挂起率,内存和磁盘写入。您可以按设备和使用特征过滤数据。

Playgrounds

• 支持 SwiftUI 实时视图和 playgrounds 中的内联结果。

已解决的问题

• 如果您的代码引用了主线程的视图,则Playgrounds不会再崩溃。(46579594)

Project Navigator

• Xcode 可以使用 Find navigator 在 workspace 或 project 中查找 assets。Asset catalog Editor 还支持查找和替换,您可以使用替换重命名 assets。

Reality Composer

• 在 AR 场景中添加了对象锚点的支持。

已解决的问题

• 其他场景的通知触发和通知操作不再出现在未编写的场景中。

Server

• Xcode Server 现在支持 Mac Catalyst 应用程序。

已解决的问题

• 解决了 Xcode Server 无法自动签署使用 iCloud,应用程序组,Apple Pay或Wallet功能的项目的问题。

签名和发布

• 签名和功能设置现在组合在 Project Editor 中的新的 Signing & Capabilities 选项卡中。新选项卡允许跨多个构建配置使用不同的应用程序功能。新功能库可以搜索可用功能。

• Xcode 11 支持新的 Apple Development 和 Apple Distribution 证书类型。这些证书支持在任何 Apple 平台上构建,运行和分发应用程序。预先存在的 iOS 和 macOS 开发和分发证书继续有效,但是,您在 Xcode 11 中创建的新证书使用新类型。以前版本的 Xcode 不支持这些证书。

已解决的问题

• 解决了 Xcode 错误报告的问题:上传到 App Store 时“No iTunes Connect access for the team”。

模拟器

• Simulator 可以根据当前电源自动选择 macOS GPU。当您的 Mac 连接到交流电源时,将使用独立的 GPU。当您的 Mac 使用电池供电时,将使用集成 GPU。您可以通过 File > GPU Selection 来更改模拟器中的策略。

simctl 现在可以覆盖 iOS 设备的状态栏值。例如,要设置时间和电池,请使用:

xcrun simctl status_bar <device> override --time“9:41” -  batiteState charge --batteryLevel 100

有关全部选项,请参阅 xcrun simctl help status_bar

• 在 macOS 10.15 上运行时,Metal 可用于 iOS 13 和 tvOS 13 模拟器。Metal 代码在主机 Mac GPU 上执行,并且明显快于模拟的 OpenGL 代码。 (watchOS 6.0 模拟器中的系统 API 也是 GPU 加速的。)SceneKit,CoreAnimation 和其他系统框架中的 API 抽象出 GPU 之间的许多差异,从而减少了对特定于设备的代码的需求。在早期版本的 macOS 上运行或在 Metal 不可用的环境中运行时,模拟器继续使用软件渲染的 OpenGL。如果您的 Mac 有多个 GPU,请使用 Simulator 中的 File 菜单选择要使用的 GPU。如果正在使用的 GPU 变得不可用,则使用它的任何模拟器都会自动关闭。

• 默认情况下,Xcode 不再创建每个可用的 iOS 模拟器设备。而是创建一组最常用的设备。要创建其他设备 - 或设备的多个实例 - 打开 Devices 窗口,选择 Simulators,单击“+”按钮,输入名称,然后选择相关的设备类型和操作系统版本。在终端中,执行 xcrun simctl create <name> <device type> <OS version> 命令,例如 xcrun simctl create "My iPhone 7" "iPhone 7" iOS13.0

• CAMetalLayer 可在 iOS 13 和 tvOS 13 模拟器中使用。

• iOS 13,watchOS 6 和 tvOS 13 模拟器现在都有一个 dyld 共享缓存。这样可以缩短模拟器的启动时间,并减少模拟器进程使用的打开文件句柄数量。

注意

丢失的符号崩溃现在可能提到共享缓存,但这不是共享缓存错误。该消息仅告知您在搜索符号时查询了共享缓存。

• simctl 现在接受运行时名称的短别名。这意味着您可以使用 simctl create'iPhone X'iOS13 等命令创建新的 iPhone X 模拟器。

• 对于 headless 和持续集成方案,您可以通过设置 defaults write com.apple.CoreSimulator FramebufferServerRendererPolicy 为 none 来配置 CoreSimulator 以跳过虚拟帧缓冲区中的合成操作。在此模式下,无法查看模拟器,并且 simctl io 无法截取屏幕截图或录制视频。

• 没有 CFBundleVersion 的捆绑包无效,无法在设备或模拟器上正确安装。 CoreSimulator 现在可以使用更清晰的错误消息在流程早期检查和拒绝此类 bundle 包。

• 模拟器 dock 图标现在包含一个快速启动模拟器的菜单。

• Simulator 的 File 菜单现在包含一个 GPU 选择菜单,用于控制 Metal 支持在模拟器中使用哪个 GPU 以及通过 Simulator 的虚拟帧缓冲进行合成。如果选中 Use External GPU When Available 项,则在连接外部 GPU 后启动的任何模拟器都使用外部 GPU。如果外部 GPU 断开连接,则使用它的任何模拟器都会自动关闭。对这些设置的更改仅在引导模拟器时生效。更改此设置时已启动的模拟器将继续使用先前选择的 GPU,直到它们重新启动。

已解决的问题

• IOSurface 现在可用于iOS 13,watchOS 6和tvOS 13模拟器。

• 模拟器中不再自动播放音频的应用程序也会打开麦克风进行输入。

• 将删除 simctl list 的 JSON 输出中先前弃用的可用性字段。 使用 isAvailable 布尔字段确定可用性。

• 修复了如果启用了自动粘贴板同步,则可能导致模拟器在其他应用程序中与剪贴板相关的操作后崩溃或无响应的问题。

• 在 Safari 中播放视频时更改模拟设备中的音频不会使视频的音频静音。

代码编辑区

• 现在,Metal 着色语言支持语义突出显示,代码完成,实时问题,符号搜索和跳转到定义。

• 通过单击 Source Control Change Bar 并选择 Show 或 Hide Change,可以在 Source Editor 中查看内联代码差异以查找更改。

• 添加了新的 High Contrast (Dark) 主题和 High Contrast (Light) 主题。还为标记,类型声明和其他声明添加了新设置。

• 为 Swift 文件中的声明添加了专用语法着色,可以在 Type Declarations and Other Declarations 下的 Preferences > Fonts & Colors 中进行自定义。不支持 C 系列语言的声明着色。

• Xcode 的源代码编辑器现在支持拼写检查。

• Xcode 11 的源代码编辑器引入了该文件的 mini-map。mini-map 包括Mark: 的清晰文本,突出显示有错误和警告的行,源控件更改,断点和突出显示的查找结果。mini-map 默认启用,可以按编辑器关闭。

• 在文档注释和 playground 标记中添加了标记的语法突出显示。您可以在 Documentation Markup 下的 Preferences > Fonts & Colors 中自定义字体,并在 Preferences > Text Editing > Display 中自定义分隔符外观。

• Toggle Comments 支持多个游标。

• 拖放文本时,行之间会打开空白区域,以便更容易查看文本的删除位置。拖动整行时,Xcode 只允许在其他行之间发生拖放。

• 编辑器允许分层代码折叠。

• 代码折叠支持方括号和括号。

//MARK:comments#pragma mark 指令现在在编辑器中绘制一个分隔线。显示标记分隔符的首选项位于 Preferences > Text Editing > Display > Show Mark Separators 中。

• 添加了控制 switch 语句中 case 标签缩进的选项。这可以在 Preferences -> Text Editing -> Indentation 下单独控制Swift和C系列语言。

• 在 Preferences> Text Editing> Indentation 中添加了一个用于控制 C++ 命名空间和外部C代码块内缩进的选项。

• 默认情况下,粘贴的文本不再重新缩进,但调整初始空格以匹配周围的文本。可以使用 Preferences > Text Editing > Indentation 来控制此操作。

• 添加了对 YAML 文件语法着色的支持。

静态分析

• 静态分析器检查在 mach 服务器例程中是否违反 MIG 调用约定。这些违规行为可能导致免费使用后的漏洞。(35380337)

• 静态分析器检查有关 out-parameters 的 IOKit 和 libkern 引用计数规则的违规。

• 静态分析器检查违反 DriverKit 引用计数规则。这些违规行为可能导致泄密和免费使用后的问题。

Testing

• 测试计划编辑器现在支持在命令行参数和环境变量条目中扩展构建设置变量时选择要使用的目标。 (51841050)

• 支持编写与 SwiftUI 视图交互的 XCTest UI 测试。

• Test Plans是管理运行哪些测试以及这些测试如何运行的新方法方案可以引用多个测试计划,并为自动化定义默认测试计划。新的测试计划编辑器支持定义测试配置,可以从计划本身继承共享设置。在 Xcode 中运行测试现在可以在所有测试配置中运行测试。更新 Source Editor 测试 diamonds 以支持在单个配置中运行测试,并更新 Test Navigator 以允许选择活动的测试计划。更新测试报告以支持显示测试计划生成的结果。

• XCTest 包括增强的性能测试功能和新的 measureWithMetrics:options:block: 方法和相关方法。 metrics 参数需要符合 XCTMetric 协议的对象列表。您可以实现自己的自定义指标,也可以使用 XCTClockMetric,XCTOSSignpostMetric,XCTCPUMetric,XCTMemoryMetric 或 XCTStorageMetric。

下面显示了一个示例性能测试,用于测量排序列表的 CPU 和内存影响:

func testExample() {
    // Measures the CPU and memory impact of sorting the input list.
    measure(metrics: [XCTCPUMetric(), XCTMemoryMetric()]) {
        sortedList = qsort(list: self.fiftyNumbersFrom0to100)
    }
}

• 添加了一个断言函数 XCTUnwrap,用于 Swift 测试。XCTUnwrap 断言 Optional 变量的值不是nil,如果断言成功则返回其值。这样就无需将 XCTAssertNotNil(_:_:file:line:) 与展开值或在其余测试中处理条件链接相结合。例如:

func testFirstNameNotEmpty() throws {
    let forenames: [String] = customer.forenames

    let firstName =  try XCTUnwrap(forenames.first)
    XCTAssertFalse(firstName.isEmpty)
}

XCTUnwrap 是一个抛出断言,最好用于上面示例中的抛出测试方法。

• 除了原始报告和存档文件之外,xccov 现在还支持直接传递结果包。例如,要查看结果包中的 coverage 报告,请按如下方式调用 xccov view --report /path/to/result_bundle.xcresult

• 结果包的格式在 Xcode 11 中更改。结果包是由 Xcode 11 生成的 asset,其 xcresult 文件扩展名包含有关构建,测试,代码覆盖率等的信息。Xcode 11 无法读取使用 Xcode 10 或更早版本生成的任何 xcresult 文件。可以通过将 -resultBundlePath ./Example.xcresult 传递给 xcodebuild 调用来生成结果包,然后可以在 Xcode 中打开 Example.xcresult。Xcode 还在派生数据中创建结果包。当前结果包版本号为 3,可以通过传递 xcodebuild 标志 -resultBundleVersion 3 来指定。版本 3 是 Xcode 11 中的默认值,但仍建议自动化显式传递标志,以便任何潜在的未来版本成为默认值不会导致现有工具出现问题。可以使用 xcresulttool 检查结果包。可以使用xcrun xcresulttool get --format json --path ./Example.xcresult 导出结果包的根对象的 JSON 表示,并且可以通过添加在 JSON 输出中找到的任何嵌套对象(由其引用标识)来导出 flag --id REF。xcresulttool 还使用 xcrun xcresulttool formatDescription 提供其格式的描述。

• 如果测试在多个目标上运行并且在某些目标上失败而在其他目标上成功,则测试报告将显示描述测试失败的目标的摘要,例如,Failed on iPad destinations running iOS 12.0。

• 查看在多个目标上运行的测试的测试报告(例如Xcode Server集成,或者由具有多个目标说明符的 xcodebuild 调用生成的结果包)时,现在可以按目标过滤显示的结果。单击范围栏中的设备按钮将显示测试运行的目标列表,包括隐藏或仅显示感兴趣的目标的功能。此外,现在可以通过范围栏中的 Mixed 按钮过滤到仅在一个目标上失败但在另一个目标上成功的那些测试。

• xcodebuild 生成的结果包现在可以直接在Xcode中共享,双击和打开。

• 介绍了为 Mac Catalyst 应用程序编写基于 XCTest 的测试的支持。

• 默认情况下为新创建的测试计划启用 Code Coverage。

• 在 macOS 上的 UI 测试中,鼠标移动(包括对悬停API的调用以及对点击,滚动和其他API的调用)将逐渐在屏幕上移动光标,就像用户在实际交互中一样,而不是立即移动光标到最终位置。对于涉及严重依赖鼠标悬停行为的 UI 的测试,这可能会导致问题。

• 针对测试计划修改 .xctestrun 文件格式,以包含有关如何在计划中执行每个测试配置的信息。当为使用测试计划的方案运行 xcodebuild build-for-testing 时,生成的 .xctestrun 文件使用 FormatVersion 2 并具有修订的属性列表结构。为不使用测试计划的方案生成的 .xctestrun 文件继续使用 FormatVersion 1,而 xcodebuild test-without-building 接受任一版本。

• 测试计划编辑器中的 Code Coverage 设置不支持选择单个目标来收集代码覆盖率。如果通过将方案转换为使用测试计划来创建测试计划,并且该方案在转换时选择了单独的代码覆盖目标,那么这些目标将保留在生成的测试计划中,但在计划中不可编辑。

• xcodebuild 增强了支持测试计划的新选项。使用新的 -showTestPlans 选项列出与方案关联的所有测试计划。使用新的 -testPlan <name> 选项指定与用于测试或构建测试的方案关联的测试计划。如果未指定 -testPlan <name>,xcodebuild 测试将使用该方案的默认测试计划。

• Xcode 11 引入了在 Xcode Localization Catalogs 中自动包含 XCTest 截图的选项。在测试计划或方案编辑器中启用本地化屏幕截图,然后在导出以进行本地化时选中“include screenshots”。

• 使用测试计划运行测试时,现在可以通过测试计划的代码覆盖率设置配置要包含在代码覆盖率结果中的目标。