iOS之深入解析Xcode 13正式版发布的40个新特性

7,271 阅读16分钟

一、前言

  •  Xcode 13 包括适用于 iOS 15、iPadOS 15、tvOS 15、watchOS 8 和 macOS Big Sur 11.3 的 SDK。
  •  Xcode 13 Release Candidate 支持 iOS 9 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。 
  • Xcode 13 需要运行 macOS 11.3 或更高版本的 Mac。 

参考资料

二、通用

  • Xcode 13 包括对 Swift 并发编程的原生支持、对 Xcode Cloud 持续集成和交付的支持、对 Git 拉取请求的集成支持、使用 DocC 在 Swift 框架中创建和查看文档的能力、Vim 键绑定支持、Swift 包集合;

  • 可以在命令行上使用 cktool 与 CloudKit 数据库架构和记录进行交互;

  • 可以在命令行上使用 TextureConverter 将纹理压缩为所有 Metal 压缩纹理格式;

  • 对于相同的内容,Xcode 13 的 XIP 存档现在大约小 15%。

三、Clang 编译器

  • 为了支持新的 Swift 并发模型,clang 现在可以在您多次调用完成处理程序或执行路径没有完成处理程序调用时发出警告;
  • 新的 -fobjc-constant-literals 标志允许您声明全局常量文字,并对其在 Objective-C 代码中支持的其他文字执行优化;
  • 可以在 Xcode 的构建设置中配置 C++20 和 GNU++20 C++;
  • 支持 C++20 似然属性 [[likely]] 和 [[unlikely]]。

四、资产目录

  • 应用程序现在可以使用其资产目录中的 iOS 应用程序图标资产作为备用应用程序图标;
  • 允许选择适用于所有平台(包括 watchOS)的通用系统颜色。

五、构建系统

  • .xcconfig 文件现在支持使用 \ 跨多行拆分长列表;

HEADER_SEARCH_PATHS = $(SRCROOT)/include \

$(SRCROOT)/include/component1 \

$(SRCROOT)/include/component2

  • 当使用 -xcconfig 命令行标志和 XCODE_XCCONFIG_FILE 环境变量将 xcconfig 文件传递给 xcodebuild 时,Xcode 会使用 New Build System 语义解析它们,该语义也支持条件参数;
  • 通过将 SUPPORTED_PLATFORMS 构建设置设置为您支持的平台列表并将 ALLOW_TARGET_PLATFORM_SPECIALIZATION 设置为 YES,将框架配置为在单个构建操作中为多个平台构建;
  • 可以在构建阶段使用平台过滤器,并为所有支持的平台定位依赖项;
  • 当发生构建失败时,xcodebuild 现在会在构建日志末尾的摘要中显示每个失败命令的目标和项目名称;
  • 当脚本阶段或自定义构建规则声明不属于构建输入的一部分,且未声明为构建中任何其他任务的输出依赖项的输入依赖项时,构建系统会发出警告;
  • 构建选项表现在包括一个依赖顺序选项,它取代了并行构建选项。

六、Core Data

  • 使用 Core Data 模型编辑器的属性检查器中的 Allows Cloud Encryption 复选框来支持 CloudKit 加密记录字段功能。

七、Core ML

  • Xcode 的 Core ML 模型编辑器现在支持新的 Core ML 包格式 .mlpackage,以及对其元数据和描述的直接编辑;
  • 当部署目标是 macOS 12、iOS 15、tvOS 15 或 watchOS 8 时,Swift 为 Core ML 模型生成的接口现在包括通过强类型 MLShapedArray 属性访问多维输入和输出。

八、Create ML

  • 两个新模板:Hand Pose Classification 和 Hand Action Classification,可用于训练模型来解释手部姿势;
  • Sound Classification 模板的新 Audio Feature Print 选项能够以更高的准确度、更低的延迟和更小的模型尺寸更快地训练声音分类器模型。

九、调试

  • Xcode 的控制台现在支持通过 Editor > Wrap Lines 菜单项切换换行;
  • 要在一行上设置列断点,请按住 Command 键并单击表达式,然后从 Actions 菜单中选择 Set Column Breakpoint;
  • 如果调试器尚未解析断点,则断点的图标将更改为占位符字形。

十、文档

  • Xcode 可以根据 Swift 代码中的注释以及随附的文章生成文档;
  • 当编写项目文档时,Code completion 会提供建议。它在源文件中编写文档注释和在 .docc 目录中编写标记文件时提供建议;
  • Quick Help 现在使用 DocC 来呈现项目文档并在文档窗口中呈现指向项目文档的链接。

十一、索引

  • Xcode 索引宏名称,它们现在出现在 Open Quickly 中。

十二、Instruments

  • Instruments 中的调用树视图和扩展详细信息视图现在用“[inlined]”标记指示内联函数;

  • 通过详细视图导航栏更容易发现不同的视图。现在可以通过快捷方式(Command-1、Command-2 等)访问详细视图;

  • 在命令行上使用 xctrace export 从包含Allocations, Leaks, 和 VM Tracker instruments 的跟踪中导出表数据;

  • Instruments 扩展详细信息视图,现在在选择关联的详细信息视图行时显示 os_log 和 os_signpost 消息和回溯;

  • Run Information 视图现在出现在 Instruments 工具栏的活动视图区域中;

  • CPU Counters 模板现在更加可靠并且具有更好的性能;

  • leaks 命令具有三种新模式:-referenceTree、-autoreleasePools和 -debug;

  • Network 模板现在包含一个用于捕获和分析 HTTP 流量的新工具;

  • Instruments 时间线视图现在使用基于 Metal 的渲染器以获得更流畅的体验,包括对时间线可用性的整体改进;

  • os_signpost 工具的记录设置现在支持在记录期间为 dynamicTracing 和 dynamicStackTracing 日志记录类别指定 os_signpost 子系统;

  • 新的 CPU Profiler 模板允许使用基于周期的性能监控中断 (PMI) 分析 CPU 工作负载;

  • 为了支持在 macOS Monterey 和 iOS 15 中生成的新 JSON 格式的崩溃日志,Instruments 包含了一个新的 CrashSymbolicator.py 脚本。

十三、Interface Builder

  • 现在可以在大纲视图中手动重新排序 Storyboard 场景;
  • macOS 的 Storyboard 和 XIB 使用 UINIbEncoder 进行编译,以减少文件大小并提高运行时性能;
  • 现在可以使用键盘选择和导航大纲视图组,例如 Constraints;
  • Interface Builder 有一个重新设计的画布底部栏,带有用于更改设备和布局的弹出窗口,以及用于更改设备外观和方向的开关;
  • 添加了对 UIButton 和 UIBarButtonItem 上的 changesSelectionAsPrimaryAction 属性的支持;
  • 支持从对象库中创作和拖动 iOS Core Location Buttons;
  • 添加了对用于静态表格视图中表格视图单元格的新内容配置样式的支持;
  • UITabBar 和 UIToolbar 检查器现在支持配置 scrollEdgeAppearance;
  • Interface Builder 现在支持 UIButton.menu;
  • 编辑启动 storyboards 时,如果总图像资源大小超过运行时阈值限制,Xcode 会发出设计时警告;
  • Watch Storyboards 的预览窗格现在显示画布样式的边;
  • 现在可以在 Interface Builder 场景中预览以下辅助功能设置:动态类型、粗体文本、按钮形状、开/关标签、增加对比度和降低透明度;
  • 现在可以启用 UILabel 的 showsExpansionTextWhenTruncated 属性以在标签被截断时显示工具提示扩展;
  • 从文档检查器 > 模拟指标 > 场景大小自定义 Mac Catalyst 模拟场景大小;
  • 通过属性检查器为使用 Mac Catalyst 构建的应用程序指定 UIControl 对象上的工具提示;
  • Interface Builder 现在支持 UIBarButtonItem.menu; 

原文|地址

十四、链接

  • dyld 共享缓存已拆分为多个文件;
  • 使用 macOS 12 或 iOS 15 或更高版本的部署目标构建的所有程序和 dylib 现在都使用链式修复格式;
  • 统一 dyld2 和 dyld3。现在所有平台上只有一个 dyld;
  • DriverKit 运行时现在有一个 dyld 共享缓存;
  • 如果 DYLD_PRINT_SEARCHING 环境变量在启动时设置为 1,则 dyld 会打印出它搜索的所有位置的路径,以找到要加载的 dylib;

十五、本地化

  • Xcode 现在可以打开 Xcode 本地化目录 (.xcloc) 以查看和编辑字符串和其他本地化资产的翻译;
  • 新的 Use Compiler to Extract Swift Strings 构建设置调用 Swift 编译器从 Text()、String(localized:)、AttributedString(localized:) 初始值设定项、SwiftUI 的 LocalizedStringKey 和 Foundation 的 StringLocalizationKey 
  • 添加了对 genstrings 和本地化导入和导出的支持,以提取在 Objective-C 代码中使用新 NSLocalizedAttributedString 宏的字符串;
  • 导出本地化时,多个本地化中的错误现在会聚合到一个警报对话框中;
  • 在导出以进行本地化时,Xcode 会自动从 Info.plist 文件中提取 NSGKFriendListUsageDescription、NSLocationTemporaryUsageDescriptionDictionary 和 NSFallDetectionUsageDescription

十六、Metal

  • Metal Debugger 现在支持 Selective Shader Debugging,它允许您限制大型 Compute 着色器的调试范围,这导致更快的着色器调试器会话创建和迭代时间;
  • Metal Debugger 中的新捕获控件可让您精确控制来决定捕获 Metal 工作负载的哪个部分,以及捕获多个帧或范围的选项;
  • Metal Debugger 现在支持导入 metallibsym 文件,这使您可以在应用程序中进行 Metal 着色器调试和分析,而无需在您的 metallib 中嵌入着色器源;
  • Metal Debugger 中的 Apple GPU 可以使用 GPU 时间线,使用此时间线可视化和检查 Metal GPU 命令的并行执行以及一组精选的 GPU 计数器;
  • 现在可以在 Metal System Trace 模板的记录选项中覆盖 GPU 性能状态;
  • Metal Debugger 现在支持 Metal 光线追踪以及新的高级加速结构查看器;
  • Metal 应用程序录制设置现在特定于正在配置的设备。

十七、Organizer

  • Xcode 现在可以近乎实时地提供崩溃报告,数据保留时间更长;
  • Xcode 现在提供具有更多过滤功能和更多统计信息的崩溃报告;
  • 现在可以通过 URL 共享崩溃报告;
  • Xcode 现在会显示您的崩溃问题的 TestFlight 反馈,以便更好地了解问题所在;
  • 现在可以根据任何特定的历史应用程序版本、任何特定的历史应用程序版本、产品类型(如 App Clip、应用程序扩展或主应用程序)以及 TestFlight 或 App Store 的发布历史记录过滤 Energy 报告列表;
  • Xcode Organizer 中的新 Scroll Hitch Goals 使分析应用程序版本的滚动体验变得容易;
  • 当查看应用的指标时,现在可以选择查看应用的 App Clip 的指标;

十八、预览

  • 预览现在支持在预览视图时检查视图的辅助功能元素。

十九、Project Navigator

  • 当 Products 组位于默认位置时,项目导航器会隐藏它;
  • Move Focus to Editor 命令现在解释 vim 方向移动键;
  • schema 编辑表不再有最大尺寸。

二十、签名和分发

  • xcodebuild 现在支持使用 App Store Connect API 密钥对 Apple Developer 网站进行身份验证;
  • Xcode 现在提供在您第一次将新应用上传到 App Store Connect 时创建应用记录的功能;
  • Xcode 分发助手中的自动签名现在支持云签名;
  • Xcode 13 支持在 Mac 上为 TestFlight 配置应用程序;
  • 现在可以在命令行上使用 notarytool 与 Apple 公证服务进行交互;

二十一、Source Control

  • 现在,可以在登录 GitHub 或 Bitbucket Server 帐户后,使用 Xcode 的源代码控制功能创建、审查和合并拉取请求;
  • 现在可以从文档选项卡栏中的任何编辑器(或编辑器拆分)中启用代码审查,默认情况下它会在内嵌演示中显示比较。

二十二、源码编辑器

  • Xcode 13 引入了 Vim 键绑定,在源代码编辑器中模拟 vim 体验并结合现有的编辑器功能;
  • 在首选项中启用 Vim 键绑定,使用文本编辑 > 编辑中的启用 Vim 键绑定选项;
  • 可以通过选择 Edit > Copy Location 以 : 的形式将所选内容的当前位置复制到剪贴板;
  • 在 Swift 中将占位符扩展为闭包时,代码完成使用闭包的参数名称而不是 <#Type#>;
  • 从 Swift 类、协议或方法声明跳转到定义还可以轻松导航到整个工作区中的所有子类、扩展和符合协议的类型;

二十三、Static Analyzer

  • 静态分析器现在警告带有副作用的断言、无限循环和更多 C++11 std::move 误用情况。

二十四、StoreKit

  • Xcode 中的 StoreKit 测试支持对使用 StoreKit 新的现代基于 Swift 的 API 构建的应用内购买进行全面测试。

二十五、Swift Packages

  • 根包和基于分支的包依赖项现在可以在其目标设置中使用 unsafeFlags;
  • Swift 包现在可以声明 Mac Catalyst 的部署目标,并且现在可以在构建条件中将 Mac Catalyst 指定为平台;
  • 当包声明工具版本为 5.5 或更高版本时,macOS 的构建条件不再适用于 Mac Catalyst;
  • Swift Packages 现在支持 DriverKit 作为平台;
  • 当尝试导入本地尚不可用的模块时,Xcode 现在会建议添加的集合中的包;
  • 现在可以在 Add Packages 表中添加精选的包集合;
  • 单元测试现在可以直接测试可执行目标。

二十六、Swift 重构

  • 新的重构有助于迁移到异步代码。“Convert Call to Async Alternative”可用于将完成处理程序作为最后一个参数的调用,并重构它们以使用新的异步语言功能,假设该函数的异步等效项已经存在;
  • 现在可以将新的 Add Async Wrapper 重构操作应用于具有完成处理程序的函数。

二十七、测试

  • XCTestCase 现在包含一个 addTeardownBlock 方法重载,其闭包参数是 async throws;

  • xcodebuild 现在支持将某些环境变量传递给测试运行器进程;

  • XCTExpectFailure 函数现在包括用于自定义某些选项的 Swift 重载,而无需创建 XCTExpectedFailure.Options 实例;

  • XCTest 现在能够在 watchOS UI 测试中合成 Digital Crown 旋转;

  • XCTest 现在包括 setUp 和 tearDown 实例方法的异步抛出重载;

  • 测试现在可以从任何线程调用 XCTestCase.expectation(description:),以及其他返回 XCTestExpectation 的 XCTestCase API,这消除了之前测试从主线程调用这些 API 的要求,并允许使用它们的现有测试采用异步,而无需 @MainActor。

二十八、App Store

  • StoreKit 2 引入了一个现代的基于 Swift 的 API,它利用了新的语言功能,如 Swift 并发性。使用这个 API 加载产品信息、在您的商店中显示应用内购买、允许客户进行购买、管理对内容和订阅的访问以及接收由 App Store 以 JSON Web 签名 (JWS) 格式签署的交易信息。 
  • 现在可以访问 Product 原始 JSON 数据以进行自定义解码。
  • Transaction 上现在提供了一个新的类型属性 unfinished,该属性返回应用程序仍需要向用户提供内容的任何交易的签名信息。

二十九、Audio Units

  • Audio Units 现在提供 Audio Unit host 可以在 iOS 中显示的自定义视图。
  • 使用 provideUserInterface 属性来确定 AUAudioUnit 是否具有用户界面。
  • 使用 requestViewController(completionHandler:) 方法获取视图的 AUViewController。
  • 自定义视图支持通过 tintColor 属性设置视图的色调颜色。这可用于将视图的颜色设置为每个轨道的不同颜色或匹配应用程序的外观。

三十、AVFoundation

  • iPadOS 应用程序现在可以继续使用相机,同时呈现多个窗口并成为屏幕上唯一的应用程序。

三十一、Core Haptics

  • 如果暂停的 CHHapticAdvancedPatternPlayer 恢复,则 CHHapticEventTypeAudioContinuous、CHHapticEventTypeHapticContinuous 和 CHHapticEventTypeAudioCustom 类型的事件现在恢复播放中间事件。 
  • 现在可以控制是否将 volume envelope 应用于类型资源。默认情况下,这些资源使用内置的音量 envelope 进行播放,该 envelope 在开始时将信号慢慢提升并在结尾慢慢降低,以避免产生咔嗒声。

三十二、Create ML

  • Create ML 框架现已在 iOS 和 iPadOS 15 中可用,为构建利用设备 ML 的动态应用程序体验开辟了新的机会。提供用于图像分类、声音分类、文本分类以及手部姿势和手部动作分类的以任务为中心的 API,以及用于经典表格分类和回归的 API。
  • 基于 Audio Feature Print 的 MLSoundClassifier 算法可以更快地训练声音分类器模型,具有更高的准确性、更低的延迟和更小的模型尺寸。该算法现在是 Create ML 中 MLSoundClassifier 的默认选项。

三十三、iCloud

  • iCloud Private Relay 将作为公开测试版发布,以收集更多反馈并提高网站兼容性。

三十四、Foundation

  • Foundation 现在包括一个自动语法协议引擎。这可以简化您的代码并减少提供的本地化字符串的数量,因为它会自动对本地化字符串进行变形以说明复数、语法协议。它适用于英语和西班牙语。
  • JSONSerialization 和 JSONDecoder 现在支持从 JSON5 解码。
  • SortDescriptor、KeyPathComparator 和 SortComparator API 提供了一个 Swift 接口来表达可归档的值排序规则。

三十四、Logging

  • 来自 Swift 的 os_signpost(_:dso:log:name:signpostID:) 是所有平台上框架操作系统的一部分

三十五、Networking

  • URLSession 发送的默认 Accept-Language 标头具有更新的格式和多个区域设置的更正值。除了首选语言之外,如果当前系统语言与首选语言不同,标头还包括作为后备的当前系统语言。此行为会影响链接到 macOS 12、iOS 15、tvOS 15 和 watchOS 8 SDK 的应用程序。 
  • URLSession 现在包括异步函数。

三十六、隐私

  • 要下载在应用隐私报告中显示应用内容的文件,可以选择设置 > 隐私 > 记录应用活动。

三十七、Safari

  • 底部标签栏经过重新设计,显示在页面内容下方。还可以选择在顶部显示地址栏。

三十八、SKAdNetwork

  • 如果开发者选择接收 winning postback,设备现在可以将 winning postback 的副本发送给广告应用的开发者。

三十九、TabularData

  • TabularData 是一个新的 Swift 框架,用于分析和操作表格数据。您可以使用 DataFrame 读取 CSV 和 JSON 文件,以及连接、分组和聚合数据

四十、UIKit

  • 对于针对 iOS 15 beta SDK 编译的应用程序,在文本视图和文本字段中键入时,按键命令不再拦截文本输入和文本编辑命令。例如,按下 Delete 键始终会删除一个字符,并且不会触发 Delete 键命令(如果存在)。要让键盘命令拦截文本输入,请将键盘命令上的 WantPriorityOverSystemBehavior 属性设置为 true。这也需要键盘命令优先于焦点键盘导航命令,例如箭头和 Tab 键按下。

  • 在 iOS 14 和 iPadOS 14 及更早版本中,当 autocorrectionType 设置为 UITextAutocorrectionTypeNo 时,QuickType 栏将被禁用。对于与 iOS 15 和 iPadOS 15 或更高版本链接的应用程序,QuickType 栏已启用并显示拼写检查候选。如果新行为不适合您的用例,请将 spellCheckingType 设置为 UITextSpellCheckingTypeNo 以隐藏 QuickType 栏。

  • 使用 iOS 15 beta SDK 进行编译时,几个与窗口相关的关键属性、方法和通知会更改行为。

参考资料