Xcode 10.2,macOS Mojave 10.14.4,iOS 12.1和其他测试版



Xcode,macOS Mojave和iOS的新Beta代码已经发布-这是我学到的要点。

Xcode 10.2 Beta的Swift 5


斯威夫特


首先,最新版本的Xcode与新版本的Swift捆绑在一起:

Apple Swift 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7)
Target: x86_64-apple-darwin18.2.0
ABI version: 0.6


让我们从最令人兴奋的新闻开始:
Swift应用程序不再包含用于iOS 12.2,watchOS 5.2和tvOS 12.2设备的Swift标准库的DLL和Swift SDK覆盖。 因此,在部署以在TestFlight中进行测试或压缩发行版的归档文件时,Swift应用程序的大小会减小。
ABI最终将变得稳定,这是个好消息。 我认为,今天这是Swift的关键问题之一-不是因为副作用,而是因为没有兑现承诺。 我的一些朋友甚至在Objective-C上重写了Apple Watch的扩展,以减小二进制文件的大小(从大约15 MB到1 MB)。 您可以通过以下链接了解有关ABI状态的更多信息: Swift ABI仪表板和Swift ABI 稳定性清单

@dynamicCallable属性允许您像使用简单语法糖的函数一样调用命名类型。 主要目的是确保与动态语言兼容。 ( SE-0216

一个例子:

 @dynamicCallable struct ToyCallable {   func dynamicallyCall(withArguments: [Int]) {}   func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2]) 

这个话题涉及面很广,创新让我百感交集。 保罗·哈德森(Paul Hudson)在“ Swift 5.0的新增功能 ”一文中从中立的角度进行了讨论。
不包括Swift 3兼容模式。 -swift-version标志的支持值为-swift-version和5。

时代已经过去:与Swift 3的源代码级兼容性不再存在。 此步骤是预期的,已在Swift 5路线图中宣布。 我强烈建议您阅读Swift 5.0 Release Process刷新您的记忆。 Swift 5在这里-准备好。
在Swift 5模式下,在Objective-C中声明或来自系统框架的枚举的switch语句必须处理未知值-即,将来可能添加的值,或可能在Objective-C实现文件中单独定义的值。

形式上,Objective-C允许您在枚举中包含与基本类型匹配的任何值。 这些未知情况可以通过新的case @unknown default @ @unknown default来处理,如果遗漏了开关中的任何已知案例,它仍然会发出警告。 也可以使用通常的default控制它们。 如果在Objective-C中指定了枚举,并且不希望客户端必须处理未知值,请使用NS_CLOSED_ENUM宏而不是NS_ENUM 。 Swift编译器可以识别它,不需要在switch语句中指定default

在Swift 4和4.2模式下,您还可以使用@unknown default 。 如果不这样做,并且开关中缺少未知值,程序将被中断-就像在Swift 4.2和Xcode 10.1( SE-0192 )中一样

这是一个长期存在的问题,仍然会带来不便,尤其是如果您不想在交换机中设置default交换机时。 我记得在iOS 12中以UNAuthorizationOptions类型出现的.provisional选项.provisional我带来了多少折磨。 现在,随着unknown案例的引入,处理这种情况变得更加容易。

迅捷包管理器


现在,当使用Swift 5中的Package.swift配置文件时,程序包可以选择Apple平台(macOS,iOS)的最低要求版本。如果至少一个依赖项的平台最低版本大于为程序包本身指定的版本,则无法进行程序包组装。 ( SE-0236

我认为,这是有关SPM的最重要新闻。 实际上,此功能可以解决许多阻止SPM在iOS世界中变得有用的问题。 在上一篇文章中,我尝试在iOS开发的背景下分析SPM的当前状态。 看来现在我必须回顾得出的结论。

但是有问题:

  • 与以前的版本相比,一些项目显示编译时间的回归;
  • 用于命令行的项目在启动时崩溃,并dyld: Library not loaded错误dyld: Library not loaded
    (未加载库)。 拐杖: SWIFT_FORCE_STATIC_LINK_STDLIB=YES自定义程序集SWIFT_FORCE_STATIC_LINK_STDLIB=YES

更改日志列出了一些已修复的错误以及有关Swift 5的其他信息,这些信息可能对您的行业很重要。 签出它们:您可能决定使用带有可变数量参数的继承的,指定的初始化程序。 也许由于类和泛型的复杂递归类型定义,您可能面临死锁问题。 否则@objc方法中的通用别名会给您带来不便。

Xcode 10.2 Beta


lang编译器


Clang编译器有很多新警报,其中大多数与框架和模块有关。 这个事实非常有趣,因为( 大概 )讨论了Swift Package Manager作为依赖项管理工具的集成。 我认为这里最重要的要点是:
  • 新的诊断程序会识别使用引号而不是框架样式包含的框架标头。 默认情况下,通知是关闭的,但是您可以通过传递clang选项-Wquoted-include-in-framework-header来启用它。
  • 框架的开放头文件可能会错误地执行#import#include封闭头文件,这会导致结构破坏,有时还会导致模块的循环导入。 此类违规将由新诊断报告。 默认情况下,它在clang处于禁用状态,并由-Wframework-include-private-from-public标志控制;
  • 在框架的标题中使用@import它们在没有模块的情况下使用。 传递—fmodules标志时,新的诊断程序将在标头中查找@import 。 默认情况下,它是通过-Watimport-in-framework-header标志禁用和控制的;
  • 早先,在为framework声明模块时丢失framework关键字不会干扰编译,但会导致错误结果。 新的诊断程序-Wincomplete-framework-module-declaration和新的修复程序将为您提供所需的密钥。 当clang —fmodules标志时, —fmodules自动触发此警告。


首先:如何打开它们? 转到项目的Build Settings菜单,选择Apple Clang-Custom Compiler Flags项,然后在Other C Flags下设置所需的标志



我尝试构建一个旧的Objective-C应用程序,并在框架的开放头文件中发现了私有头文件的许多问题:



框架内导入引号也存在问题:



我建议您进行类似的诊断,或者至少为将来做个记录。 一旦这些问题会造成很多麻烦。

建立系统


代码构建系统也有一个不错的更新。
现在,在隐式依赖关系中的搜索也可以在标记为-framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l —l.的相关框架和库的“其他链接器标志”部分中进行-framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l —l.

这项创新也很有趣。 从本质上讲,这意味着您现在可以使用.xcconfig甚至xcodebuild来定义隐式依赖xcodebuild ,从而避免了Xcode本身中的Link / Embed阶段。

侦错


调试器创新:
现在, UIStackView属性显示在可视调试器检查器中。 可视调试器具有更紧凑的三维外观。




现在,如果由于内存不足而发生错误,Xcode可以自动创建内存使用情况图表。 您可以在诊断窗口的设置执行方案中启用图形的创建。

在iOS和watchOS中达到内存使用量限制时,Xcode在内存使用量报告中显示该限制。




看到红线了吗? 达到时,Watchdog将收到通知applicationDidReceiveMemoryWarning 。 我认为此更新会更有用,但现在只是一个小小的优点。

LLDB调试器


LLDB中出现了新的面包:
  • 现在,在计算闭包内部的表达式时,可以使用$ 0,$ 1和其他缩写。
  • LLDB现在为frame variable命令添加了一个新别名v ,该别名用于显示当前帧堆栈中的变量。 由于这不包含用于评估表达式的工具,因此v可以比ppo快得多,因此是可取的。


我没有发现性能上的改进,但是在某些情况下v可以提供更好的输出-但这并不是po的直接替代,只能在当前帧堆栈有一定限制的情况下使用。 范例:



游乐场


我最喜欢的部分! 让我们从错误开始:
Playgrounds应用可能无法启动

不幸的是,新Beta中没有关于Playgrounds的其他新闻。

仿真器


关于模拟器的几句话:
Siri在watchOS和iOS模拟器中不起作用。

macOS和模拟的iOS设备之间的粘贴板同步已变得更加可靠。


我希望这是真的。

所有模拟设备上的麦克风访问请求都不会重复。


这是一个好消息,因为许多人因为此问题而难以使用CI并建立代理。 现在,您可以建立拐杖,或者至少可以通过包括“一次运行模拟器”选项来补充有关组装代理的指南。

测试中


  • xccov支持将多个代码覆盖率报告(和相关归档)组合到一个通用报告和归档中。 生成的报告可能不准确,因为在创建报告的那一刻之间,源文件中可能会发生更改。 如果未发生任何更改,则报告将是正确的。
  • xccov现在反映了各种Xcode覆盖率报告之间的差异,可用于计算覆盖率变化。 例如,要突出显示before.xccovreportafter.xccovreport之间的区别,请按如下所示调用xccov命令: xccov diff --json before.xccovreport after.xccovreport
  • 静态库和框架目标现在以顶级条目的形式出现在覆盖率报告中-为包括静态库或框架的所有目标收集了覆盖率指标图。 即使将静态库或框架目标的源文件从图中的代码覆盖范围中删除,也可以解决将静态库或框架目标的源文件输入到报表中的问题。


持续集成的好消息,特别是差异的证明。 告诉您的发布工程师或从事类似工作的人员。

但是,关于测试并行化存在一些限制:

  • 启用并行化后,无法在克隆上进行记录;
  • 在启用测试并行化的情况下,从Xcode进行项目分析的行为不正确。


其余的人对一些错误的更正感到满意:
如果由于启动时测试运行程序崩溃而导致测试失败,则Xcode将尝试生成描述错误的详细消息。 您可以在测试日志中检查该错误,如果使用xcodebuild ,则该错误也会显示在stdout 。 它也包含在结果包的结构化日志中。

我们经常遇到类似的问题-我们对所发生的事情不知所措。 有时问题是布局错误,有时系统过载。 现在,应用程序的可靠性将提高。
在测试过程中收集的崩溃报告中,重要部分(例如崩溃原因或描述)不再丢失。

这里暂无评论,非常高兴。
对许多开发人员有用的最新消息:Xcode现在支持macOS内容缓存服务 。 这意味着您可以在本地网络上创建缓存服务器,当在本地网络上下载新版本和旧版本的Xcode时,这将节省时间和金钱。

问题所在


在此Beta中,我遇到了几个问题。 他们主要关注第三方开发人员提供的工具。 例如, carthage生成错误“找不到适用于iOS的模拟器”。

我检查了可用的模拟器,似乎应该归咎于beta错误。 此外,无法从Xcode下载其他运行时-可用的模拟器列表为空:

 $ xcrun simctl list devices --json | grep -A16 12.1   "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [     {       "availability" : "(unavailable, runtime profile not found)",       "state" : "Shutdown",       "isAvailable" : false,       "name" : "iPhone 5s",       "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB",       "availabilityError" : "runtime profile not found"     },     {       "availability" : "(unavailable, runtime profile not found)",       "state" : "Shutdown",       "isAvailable" : false,       "name" : "iPhone 6",       "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1",       "availabilityError" : "runtime profile not found"     }, -- 

但是,这只是beta版,更改列表非常多。 我们会耐心的。 迦太基已经在研究情况,此错误中概述了所有猜测。

iOS 12.2 Beta


一般般 苹果似乎正忙于清理技术债务并应用安全补丁,因此没有什么重大消息,但存在两个问题:
  • 选择卡后,您可能无法使用电子钱包进行身份验证;
  • 您有可能无法使用移动网络购买预付费资费计划。


苹果新闻现已在加拿大上市。

请勿切换。

macOS Mojave 10.14.4 Beta


从Safari 10.1.2升级后,这里唯一的更新是Safari 12.1可能存在的问题。
从Safari 10.1.2升级到Safari 12.1后,网页可能无法正确显示。 (47335741)

解决方法:在终端中键入defaults delete com.apple.Safari 。 请注意,这样做会丢失所有以前的Safari设置。

总结


这篇文章比我预期的要大得多。 您将在上面找到我的所有发现。 简而言之-Swift 5来了!

谢谢您的关注。

Source: https://habr.com/ru/post/zh-CN437814/


All Articles