WWDC 2018 iOS 开发者日记
已发表: 2022-03-10美国夏天的传统界限是阵亡将士纪念日和劳动节,但 iOS 开发人员通过 WWDC 和 iPhone 发布来标记夏天。 尽管本周纽约市的天气凉爽多雨,但我仍处于夏天的心情中,并期待着夏天的更新和 WWDC 的承诺。

现在是 6 月 4 日早上,我正在回顾我在 WWDC 2017 上的笔记。去年,我写道 ARKit 和 Core ML 是两大亮点。 看到 Apple 专注于机器学习 (ML) 令人耳目一新,但在 2017 年剩下的时间里并没有太多跟进。ARKit 已经引起了一些兴趣,但没有杀手级应用程序(也许是 Pokemon Go,但在 ARKit 之前很流行) . 在 Core ML 发布后,Apple 并未将其添加到其初始的 Core ML 可下载模型库中。
Apple 确实发布了 Turi Create,Lobe 上个月发布了一个新的有趣的 Core ML 模型制造商。 在 Apple/ML 领域,Swift 的创造者 Chris Lattner 正在对 Swift for TensorFlow 采取不同的方法。 但从外部看,Core ML 似乎主要有一个明显的用途:图像分类。 似乎没有太多精力围绕着探索截然不同的应用程序(尽管我们都知道 ML 是自动驾驶汽车和谷歌 Duplex 等令人惊叹的演示的核心)。
Apple 使用 ML 的另一种方式是在 Siri 中,今年早些时候,我写了一篇关于 SiriKit 的文章,并提到了它与 Alexa 和 Google 相比的感知和实际缺陷。 我探讨的一个问题是 Siri 对预定义意图的强调如何限制了它的范围,但并没有产生你可能从有限焦点中获得的承诺的准确性。
去年推出的 HomePod 仅凸显了 Siri 的困境,一项广泛报道的客户满意度调查显示,对 iPhone X 的满意度为 98%,但对 Siri 的满意度仅为 20%。
考虑到所有这些,我个人希望听到 Apple 将在 AR、ML 和 Siri 方面做出一些重大改进。 具体来说,作为一名 iOS 开发人员,我希望看到更多的 Core ML 模型,不仅涵盖图像分类,还可以帮助制作模型。 对于 Siri,我希望看到更多的意图,并且可能有一些迹象表明意图将是一个全年都会添加的东西。 这是一个远景,但对于 AR,下一步是设备。 但与此同时,我希望提高空间精度。
最后,我喜欢 Xcode Playgrounds 和 iPad Playground 书籍,但它们需要更快更稳定,所以我也希望能有一些东西。
在 WWDC 的早上,我发了一条推文:

这不是预测。 这只是我想在 2017 年使用的东西的清单,但发现它们动力不足或太难让我开始使用,并希望 Apple 能做出一些改进。
我今天的计划是现场观看主题演讲,然后观看 Platforms State of the Union。 这些很好地概述了本周剩余时间要关注的内容。
第一天结束:主题演讲和平台国情咨文
WWDC 的第一天是主题演讲,面向公众消费,平台状态联盟是整个活动的概述,并为开发人员提供了一些细节,以便他们可以选择参加哪些会议。
值得注意的非 iOS 开发者公告摘要
WWDC 并不完全是关于 iOS 开发的,所以这里有一个在其他平台上发生的或者不是非常关注开发人员的事情的快速列表。
- 为了摆脱它,根本没有硬件公告。 Mac Pro 上没有预览和更新。 我们将不得不等待秋季的 iPhone 和后续活动。
- iOS 12 有一个新的 Shortcuts 应用程序,这似乎是他们收购 Workflow 的结果。 这是一种通过拖放“编写”一系列步骤的方法。 您还可以将快捷方式分配给 Siri 关键字,我将在下面介绍。
- iOS 会自动将来自同一应用程序的通知分组,并让您将它们作为一个组进行操作。
- Animojis 现在可以模仿你伸出你的舌头,而新的Memojis 是高度可配置的人脸,你可以自定义它们看起来像你自己。
- FaceTime 支持最多 32 人的群组视频聊天。
- 有一个新的Screen Time 应用程序可以为您提供有关手机和应用程序使用情况的报告(帮助您控制自己并减少分心)。 它也是新的家长控制的基础。
- Apple TV 有一个小更新:支持杜比全景声和来自国际空间站的新屏幕保护程序。

- 手表有一个竞争模式,可以挑战其他人进行与锻炼相关的挑战。 它还会尝试自动检测锻炼的开始和结束,以防您忘记开始或停止锻炼,现在它有徒步旅行和瑜伽锻炼。
- 手表还具有新的对讲机模式,您可以为受信任的联系人启用该模式。
- Watch 上有更多原生的音频 SDK, Apple 的 Podcasts 应用程序现在可用。 我预计第三方播客应用程序也将利用这些新的 SDK。
- Mac 获得了活动的重点(希望这表明重新受到关注)。 它将被称为macOS Mojave,并具有暗模式。
- Mac App Store 有重大更新,但值得注意的是,它现在获得了与 iOS App Store 去年相同的视觉和内容处理。 沙盒有足够多的变化, Panic 决定将 Transit 移回那里。
- Finder 中的快速查看现在可以对文件执行一些简单的操作(例如旋转图像),并且可以通过 Automator 进行自定义。
- Mojave 将是支持 32 位应用程序和框架的 macOS 的最后一个版本,这意味着 Quick Time Framework 将消失。 它似乎已被操作系统本身的一些视频捕获功能所取代。
- Apple 宣布他们正在内部使用UIKit 的端口来制作 Mac 应用程序,并展示了 Stocks、News、Home 和 Voice Memos 的端口。 新框架将于 2019 年发布。
我最兴奋的 iOS 开发者公告
iOS 开发者也得到了一些好消息。 他们谈到了我希望看到改进的四个主要领域:
- SiriKit 现在有自定义意图,这打开了很多可能性。
- Create ML 是一种使用 Xcode Playgrounds 通过迁移学习训练模型的新方法,它允许您使用自己的训练数据来扩充现有模型。
- Xcode Playground 现在允许您将代码添加到页面底部并在不重新启动的情况下运行它。 在 9 月份发布真正的版本之前,很难知道 Playgrounds 是否会更加稳定,但这将使尝试代码的速度更快。
- ARKit 2 与一种名为 USDZ 的新增强现实文件格式一起发布,该文件格式是开放的,由 Adobe 和 Pixar 开发。 Adobe 已经宣布了一些工具支持。 它将允许用户和开发人员存储和共享 AR 资产和体验。 此外,ARKit 2 允许多个设备处于同一个 AR 环境中,并支持 3D 对象检测。
我们没有得到 AR 设备,但感觉我们很快就会得到一台。 它需要来自 Apple(而不是第三方),因为运行 ARKit 需要 iOS 设备。
设置您的机器
您需要的一切现在都可以在开发人员门户中获得。 要使用文章中的代码,您需要 Xcode 10 Beta。 我不建议您使用 iOS 12 Beta,但如果您真的想要,请转到您设备上的门户并下载 iOS 12 Beta 配置文件。
你需要一个带有测试版的设备的唯一主要的事情是 ARKit 2。其他一切都应该在 Xcode 10 的模拟器中运行得足够好。 从第一个测试版开始,模拟器中的 Siri Shortcut 支持是有限的,但足以认为这将在未来的版本中得到修复。
第 2 天结束:使用 Siri 自定义 Intents
去年,我写了你需要如何适应 Apple 的预定义意图,以便在你的应用程序中使用 SiriKit。 该机制于 2016 年引入,并在 2017 年甚至在 WWDC 活动之间添加。 但很明显,亚马逊的自定义意图方法在将语音控制引入更多样化的应用程序方面更胜一筹,苹果上周将这一点添加到了 SiriKit 中。
需要明确的是,这是第一个实现,所以它还没有 Alexa Skills 那样广泛,但它为 Siri 开辟了相当多的可能性。 正如我在上一篇文章中所讨论的,自定义意图的主要限制是开发人员需要完成所有语言翻译。 SiriKit 通过要求用户提供他们想要使用的短语来解决这个问题,但自定义意图仍然需要比预定义意图更多的翻译。
而且它们建立在与预定义意图相同的基础上,因此我所涵盖的所有内容仍然适用。 实际上,我将向您展示如何将新的自定义意图添加到 List-o-Mat,这是我为原始 SiriKit 文章编写的应用程序。
(免费)如果您已经支持 Spotlight,则支持 Siri 快捷方式
如果您使用NSUserActivity
在您的应用程序中指示用户可以通过切换或搜索启动的内容,那么让 Siri 也可以使用它们是微不足道的。
您需要做的就是将以下行添加到您的活动对象中:
activity.isEligibleForPrediction = true
这仅适用于启用 Spotlight 的活动(其中isEligibleForSearch
为true
)。
现在,当用户执行此活动时,它被视为捐赠用于 Siri。 Siri 会推荐非常常用的活动,或者用户可以在快捷方式应用程序中找到它们。 在任何一种情况下,用户都可以分配他们自己的口语短语来启动它。 您对通过 Spotlight 启动活动的支持足以支持它通过快捷方式启动。
在 List-o-Mat 中,我们可以通过构造活动对象并将它们分配给ListViewController
来使 Spotlight 和 Siri 可以使用各个列表。 用户可以通过 Siri 用自己的短语打开它们。
在我们的例子中它是多余的,因为我们有一个打开列表的预定义意图,但是大多数应用程序没有那么幸运,现在有了这个简单的机制。 因此,如果您的应用有 Siri 的预定义意图不支持的活动(例如播放播客),您可以让它们符合预测条件,而不必担心自定义意图。
配置 SiriKit 以使用自定义 Intent
如果您确实需要使用自定义意图,则需要将 SiriKit 添加到您的应用程序中,这需要一些配置。
为自定义意图配置 SiriKit 的所有步骤都与预定义意图相同,这在我的 SiriKit 关于 Smashing 的文章中有详细介绍。 总结一下:
- 您正在添加一个扩展程序,因此您需要一个新的 App ID,并且配置文件和您的应用程序的权利需要添加了 Siri。
- 您可能需要一个 App Group(这是扩展程序和应用程序通信的方式)。
- 你的项目中需要一个 Intents 扩展
- 您需要更新 Siri 特定的.plist密钥和项目权利。
所有细节都可以在我的 SiriKit 文章中找到,所以我将只介绍在 List-o-Mat 中支持自定义意图所需的内容。
将复制列表命令添加到 List-o-Mat
自定义意图仅用于没有预定义意图的情况,Siri 实际上在其列表和备注 Siri 域中提供了大量列表和任务支持。
但是,使用列表的一种方法是作为重复例程或过程的模板。 为此,我们需要复制现有列表并取消选中其所有项目。 内置列表意图不支持此操作。
首先,我们需要添加一种手动执行此操作的方法。 这是 List-o-Mat 中这种新行为的演示:

为了让 Siri 可以调用此行为,我们将“捐赠意图”,这意味着每次您执行此操作时我们都会告诉 iOS。 然后,它最终会在早上得知,您喜欢复制此列表并将其作为快捷方式提供。 用户还可以查找捐赠的意图并手动分配短语。
创建自定义意图
下一步是在 Xcode 中创建自定义意图。 有一个新的文件模板,所以:
- 选择 File → New File 并选择“SiriKit Intent Definition File”。
选择添加意图定义文件(大预览) - 将文件命名为ListOMatCustomIntents.intentdefinition ,然后选择将文件放在 App 和 Intent Extension 目标中。 这将自动为实现意图协议但实现您的自定义行为的两个目标生成类。
- 打开定义文件。
- 使用左下角的 + 按钮添加一个意图并将其命名为“CopyList”。
- 将类别设置为“创建”并填写标题和副标题以描述意图:
向意图添加类别、标题和副标题(大预览) - 添加一个名为“list”的字符串参数。
添加一个名为“list”的字符串参数(大预览) - 使用列表参数添加快捷方式类型,并为其命名为“复制列表”。
添加标题为“复制列表”的快捷方式类型(大预览)
如果你查看 Intent plist,你会看到这个 Intent 已经为你配置好了:


捐赠意图
当我们在我们的应用程序中进行我们希望 Siri 知道的用户交互时,我们会将其捐赠给 Siri。 Siri 会跟踪上下文信息,例如时间、星期几,甚至位置,如果它注意到某种模式,它会为用户提供快捷方式。
当我们点击 Copy 菜单时,添加以下代码:
@available(iOS 12, *) func donateCopyListInteraction(listName: String) { let copyListInteraction = CopyListIntent() copyListInteraction.list = listName copyListInteraction.suggestedInvocationPhrase = "Copy \(listName)" let interaction = INInteraction(intent: copyListInteraction, response: nil) interaction.donate { [weak self] (error) in self?.show(error: error) } }
这只是创建了一个自动生成的CopyListIntent
类的对象并将其捐赠给 Siri。 通常,iOS 会收集这些信息并等待适当的时间显示它,但对于开发,您可以打开“设置”应用,进入“开发者”部分,然后打开 Siri Shortcut 调试设置。
注意:在撰写本文时,在第一个 beta 版本中,此调试设置仅适用于设备,不适用于模拟器。 由于设置在那里,我希望它可以在进一步的测试版中开始工作。

当您执行此操作时,您捐赠的快捷方式会显示在 Spotlight 的 Siri 建议中。

点击它会调用你的 Intent 扩展,因为我们允许后台执行。 接下来我们将添加对此的支持。
处理自定义意图
我们已经有了一个 Intents 扩展,并且由于自定义意图定义文件已经添加到该文件中,因此它还具有生成的意图类。 我们需要做的就是添加一个处理程序。
第一步是向扩展添加一个名为CopyListIntentHandler
的新类。 这是它的代码:
import Intents @available(iOS 12, *) class CopyListIntentHandler: ListOMatIntentsHandler, CopyListIntentHandling { func handle(intent: CopyListIntent, completion: @escaping (CopyListIntentResponse) -> Void) { // Find the list var lists = loadLists() guard let listName = intent.list?.lowercased(), let listIndex = lists.index(where: { $0.name.lowercased() == listName}) else { completion(CopyListIntentResponse(code: .failure, userActivity: nil)) return } // Copy the list to the top, and respond with success copyList(from: &lists, atIndex: listIndex, toIndex: 0) save(lists: lists) let response = CopyListIntentResponse(code: .success, userActivity: nil) completion(response) } }
自定义意图只有一个确认和处理阶段(不支持自定义参数解析)。 由于默认的confirm()
返回成功,我们只需实现handle()
,它必须查找列表,复制它,并让 Siri 知道它是否成功。
您还需要通过添加以下代码从已注册的意图处理程序分派到此类:
if #available(iOS 12, *) { if intent is CopyListIntent { return CopyListIntentHandler() } }
现在你可以点击 Siri 的建议,它会弹出这个:

点击创建按钮将复制列表。 由于我们在意图定义文件中选择的类别,按钮显示为“创建”。
唷,那是很多。 这些新的 Siri 快捷方式是 iOS 12 中的主要功能,它有一个新的大型开发人员界面可供探索。 此外,由于我碰巧有一个很好的(并且记录在案的)Siri 示例可以使用,因此本周尝试向其中添加新功能是合理的。
您可以在 GitHub 中看到更新的 List-o-Mat。 在 Xcode 10 和 iOS 12 发布之前,它都在自己的分支中。
接下来的几天,我将主要关注 Apple 示例代码或制作更小的项目。
第 3 天结束:Xcode 游乐场
前一整天都在 Xcode 10 beta 中度过,它没有崩溃一次,似乎已经准备好进行开发了。 所以现在我想探索新的 Playgrounds 功能。
我对游乐场的主要要求是让它们更稳定、更快。 为了让它们更快,Apple 添加了一个重要功能——REPL 模式。
在 Xcode 10 之前,当您在一个已自动运行(这是默认设置)的 Playground 中时,每一行代码实际上都会重新构建整个文件并从头开始运行它。 如果你建立了任何状态,它就会丢失。 但是,真正的问题是这对于迭代开发来说太慢了。 当我使用 Playgrounds 时,我将它们设置为手动运行,但即使这样也很慢。
在 Xcode 10 中,手动运行更为规范,但运行后,您可以在页面底部添加更多行并继续执行。 这意味着您可以迭代地探索数据和绘制视图,而无需不断地重新构建和从头开始。
首先,我使用 Single View 模板创建了一个 iOS 操场(文件 → 新建 → 操场)。
通过下拉播放按钮下方的菜单(左下角的三角形)打开手动运行。 这会在左侧放置一个垂直条,显示播放头的当前位置(有点像断点)。
您可以点击任何一行,然后点击其左侧的播放按钮。 这将使 Playground 运行到这一点。 然后,您可以通过在 Playground 中点击下方的线条来走得更远。 至关重要的是,您可以在底部添加更多行并在每行之后键入Shift + Enter以将播放头移动到该点。
这是我在无需重新启动 Playground 的情况下更改视图标签的 GIF。 在我键入的每一行之后,我按Shift + Enter 。

Playgrounds 现在还支持您的类型的自定义呈现,Apple 正在大力推动每个 Swift 框架包含一个 Playground 来记录它。

第 4 天结束:创建 ML
去年,Apple 在为其设备编写机器学习编程方面取得了巨大飞跃。 Xcode 中有一种新的 ML 模型文件格式和对它的直接支持。
潜力在于这些模型文件将有一个大型库,将有创建它们的工具,并且更多的应用程序开发人员将能够将 ML 合并到他们的项目中,而无需知道如何创建模型。
这还没有完全实现。 WWDC 之后,Apple 没有添加到模型存储库中,尽管有第三方存储库,但它们大多具有图像分类演示的变体模型。 ML 不仅仅用于图像分类,但没有出现广泛的示例选择。
因此,很明显,任何真正的应用程序都需要其开发人员来训练新模型。 苹果为此发布了 Turi Create,但它远非简单。
在 WWDC 2018 上,Apple 对 Core ML 做了几件事:
- 他们扩展了 Core ML 的自然语言处理 (NLP) 部分,为我们提供了一个新的主要示例领域。
- 他们在 Core ML 中添加了迁移学习的概念,允许您将训练数据添加到现有模型中。 这意味着您可以从库中获取模型,并将它们自定义为您自己的数据(例如,让它们识别您提供的图像中的新对象)。
- 他们发布了 Create ML,它在 Xcode Playgrounds 内部实现,允许您拖放数据以进行训练并生成模型扩展(使用迁移学习)。
这是使机器学习民主化的又一个很好的步骤。 这里没有太多代码可以写。 要扩展图像分类器,您只需要收集和标记图像。 拥有它们后,您只需将它们拖入 Create ML。 您可以在此 Create ML WWDC 视频中看到演示。
本周结束:玩新的 AR 演示
ARKit 是去年的另一个重要补充,AR 设备的到来似乎更加明显。
我去年文章中的 ARKit 代码仍然是入门的好方法。 大多数新功能都是为了让 AR 更准确、更快。
在那之后,如果你已经安装了一个测试版,你肯定会想下载新的 SwiftShot ARKit 演示应用程序。 这个应用程序利用了 ARKit 的新功能,尤其是多人游戏体验。 同一网络和同一地点的两台或多台设备可以相互通信并看到相同的 AR 体验。
当然,要玩这个,你需要两台或更多你愿意安装 iOS 12 测试版的设备。 我正在等待公开测试版执行此操作,因为我只有一个测试版安全设备。
更容易使用的 AR 应用是新的 Measure 应用,它允许您测量在 AR 相机视图中看到的真实物体的长度。 已经有第三方应用程序可以做到这一点,但 Apple 的应用程序经过优化并预装了 iOS 12。
WWDC 视频和示例代码的链接
因此,我期待今年夏天在 Xcode 10 和 iOS 12 上做更多的事情,同时我们等待新手机和苹果可能在夏末发布的任何设备。 与此同时,iOS 开发人员可以享受阳光,使用我们的新测试版 Watch OS 跟踪我们的徒步旅行,并在有机会时观看这些 WWDC 视频。
您可以从 Apple 开发者门户流式传输 WWDC 2018 视频。 还有这个用于观看 WWDC 视频的非官方 Mac 应用程序。
以下是本文中引用的视频:
- WWDC 2018 主题演讲
- WWDC 2018 平台国情咨文
- Siri 快捷方式简介
- 在 Xcode 中充分利用 Playgrounds
- 介绍 Create ML,如果您想要更高级的东西,Turi Create 指南
要开始使用 Xcode 10 和 iOS 12:
- 下载测试版(在设备上访问以获取测试版配置文件)
- 带有 Siri Shortcut 更新的 List-o-Mat
- Swift Shot(多人 ARKit 2 游戏)