Xcode 11.4 新特性概览

作者: iOS_小久 | 来源:发表于2020-04-01 14:19 被阅读0次

    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 的目标,默认情况下此构建设置为启用。现在,此类目标中的源文件可以导入 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 中的文档。

    作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:1012951431 不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

    另附上一份各好友收集的大厂面试题,进群可自行下载!

    相关文章

      网友评论

        本文标题:Xcode 11.4 新特性概览

        本文链接:https://www.haomeiwen.com/subject/fatauhtx.html