本文是针对 Session 602: What's New in ARKit 2 的解读算法
ARKit 2 让咱们用全新的方式与真实世界互动——多台 iOS 设备能够同时浏览同一个 AR 场景,或是玩多人 AR 游戏。此外还增长了追踪 2D 图片和检测已知 3D 对象(例如雕塑、玩具、家具等等)的能力。数组
Apple 在去年的 WWDC 上发布了 iOS 11 与移动 AR 开发框架 ARKit,目前 ARKit 已经部署到了数亿台 iOS 设备上,让 iOS 成为了最大的、最早进的 AR 平台。网络
ARKit 的接口简单易用,但具有不少强大的功能,开发者也在过去的一年里开发出了不少神奇的产品:session
ARKit 也是一种很是有趣的教育方式:app
除了上面举的几个例子,App Store 里还有不少不少神奇的 AR 做品。框架
追踪是 ARKit 的核心功能,能够得到设备在物理世界中的方向和位置,此外还能够追踪物体(例如人脸)。机器学习
场景理解经过学习环境的一些属性来优化追踪,检测水平面(例如地面和桌面)和垂直面以便在场景中放置物体。场景理解还会学习环境中的光照状况,以便在虚拟场景中精确模拟真实的光照,以防物体看起来过亮或过暗。ide
渲染就是指用户在设备上实际看到、而且在 AR 场景中交互的内容。ARKit 能够很方便的与你喜欢的渲染引擎进行集成,还为 SceneKit 和 SpriteKit 提供了内置视图。此外 Xcode 还提供了能够快速上手的 Metal 模板。学习
此外还为 Unity 和 Unreal 的公开游戏引擎集成了完整的 ARKit 功能。测试
因此若是要开始制做 ARKit 项目,以上游戏引擎均可供选择。
加载和保存地图是世界追踪的一部分,世界追踪能够给出真实世界中设备的位置和角度(6自由度),以便在场景中放置物体,以下图中的桌子椅子所示。
世界追踪还能够给出精确的物理尺度,以便以正确的尺寸放置物体,以防过大或太小。物理尺寸还能够用于精确测量,例如 iOS 12 中提供的 Measure app。
世界追踪还会给出 3D 特征点,能够了解环境中的一些物理结构,以便执行命中测试(hit testing),从而在场景中放置物体。
iOS 11.3 发布了从新定位(Relocalization)功能,即便 ARSession 被打断了(例如 app 进入后台或使用 iPad 上的画中画功能),也能够随后恢复以前的追踪状态。
从新定位功能的实现依赖于一张被世界追踪不断绘制的地图,随着用户在环境中不断移动,这张地图也会学习更多环境特征并不断延展,如今这张地图在 ARKit API 中以 ARWorldMap 对象提供给开发者使用了。
ARWorldMap 映射了物理 3D 空间,如上图所示。
同时,物理空间中的锚点(anchor)也很重要,以便在相应的位置放置虚拟物体,因此 ARWorldMap 中默认包含全部平面锚点,此外开发者还能够在场景中添加自定义锚点,WorldMap 中的锚点列表也会保存这些自定义锚点。
为了便于可视化和 debug,ARWorldMap 还会提供原始特征点以及范围(extent),以便理解用户扫描的物体空间结构。
最关键的一点是,ARWorldMap 是一个可序列化(serialization)对象,能够被序列化为任意你想要的数据格式,做为本地磁盘上一个文件或分享到云端。
因此,ARWorldMap 为咱们带来了 ARKit 的两种全新体验:
举个例子,一个用户开启了世界追踪,而后经过 ARKit 命中测试在场景中放了一个物体。
在用户离开以前,他在设备上保存了这张 WorldMap。
一段时间以后,这个用户又回到了这里,此时他能够加载以前的那张 WorldMap,并得到与以前彻底相同的加强现实体验。
他还能够不断重复这个过程,而且之后每次来到这个桌子的时候都能看到他以前摆放的这些物体。
以上就是世界追踪中的持久化体验。
ARWorldMap 还为咱们带来了多人体验,如今 AR 体验能够与其余用户共享,而再也不只局限于单设备或单用户。用户能够生成地图,并将其共享给其余用户。
WorldMap 表明了现实世界中的坐标系,因此用户会共享同一个坐标系,而且从不一样的视角体验同一个 AR 场景,就像 WWDC 上演示的那个多人游戏同样,此外 WorldMap 还能够用于建立多人共享的教育体验。
因为 ARWorldMap 是开放给开发者的,因此咱们能够用任意技术手段来共享它,例如使用支持多人链接的隔空投送(依赖本地蓝牙或 WiFi),因此即便没有网络也能够实现。
获取和加载 WorldMap 的 API 很是简单:
在任什么时候间点均可以从 ARSession 对象上获取当前的 WorldMap,并在 completion handler 里返回该 ARWorldMap 对象,若是没法获取 WorldMap 则会返回 error。
取得 WorldMap 以后,只要在初始化 ARWorldTrackingConfiguration 时给 initialWorldMap 属性赋值并运行便可,或者经过配置 ARSession 的 configuration 并运行便可实现动态改变。
ARSession 携带 ARWorldMap 启动以后,会执行 iOS 11.3 引入的从新定位功能。
要让从新定位功能可靠运行,就须要获取良好的 WorldMap。首先,要从多个视角扫描物理空间,便于追踪系统学习环境中的物理结构。同时,环境须要是静态的,而且具备良好的纹理,以便学习更多环境特征。其次,地图须要密集的特征点,这样才能可靠地进行从新定位。
不过不用担忧,ARKit API 简化了这一步,ARFrame 上新增了 worldMappingStatus 属性:
每一个 ARFrame 都会更新 worldMappingStatus 属性,使用方法以下:
刚启动世界追踪时,WorldMappingStatus 处于 Not Avaiable 状态,开始扫描物理空间后,状态就会变为 Limited:
随着在物理世界中的移动,世界追踪会持续延展 World Map(Extending)。
若是对物理世界的扫描充足,WorldMappingStatus 会变成 Mapped:
但若是走出了 map 所对应的物理空间,WorldMappingStatus 就会再次回到 Limited,并继续学习新看到的环境:
因此应该如何在应用里使用 WorldMappingStatus 呢?假设咱们正在开发一个 app,用户能够与其余人分享他的 World Map,界面下方有一个 “Share Map” 按钮:
WorldMappingStatus 处于 Not Available 或 Limited 状态时,应该禁用这个按钮。
状态进入 extending 后,则须要在界面上显示一个 Activity Indicator:
这样会鼓励用户在物理世界中继续移动,持续扫描并扩展 map 以便用于进行从新定位。WorldMappingStatus 变成 mapped 以后,就能够启用 Share Map 按钮并隐藏 Activity Indicator 了,以便让用户分享地图:
下面是保存和加载地图的 Demo,这个 Demo 由两个 app 组成,一个用于获取地图并保存为本地文件,另外一个则会加载以前那张地图并恢复为与以前彻底相同的 AR 体验:
刚打开 app 时,能够看到右上角的 WorldMappingStatus 为 Not Available:
而后在环境里来回移动,状态就会变为 Extending:
而后继续在环境中移动,WorldMappingStatus 就会变成 Mapped:
也就是说目前特征点已经足够从新定位使用了,因此此时已经能够获取并保存 World Map 了,但为了让 AR 体验更有趣一点,我打算经过命中测试来放置一个自定义锚点(一台老电视):
点击保存 World Map(固然我也能够继续构建地图),World Map 保存后 app 显示出了它包含的全部特征点:
上面这些小蓝点都是 World Map 的一部分,而且该 World Map 已经序列化为文件了,如今能够在另外一个 app 中恢复刚刚的 AR 体验。我移动到了与刚刚不一样的位置,屏幕上显示出了我目前的世界原点:
目前世界追踪正处于从新定位状态,也就是 iOS 11.3 引入的从新定位功能。如今把设备指向刚刚建立 World Map 的物理位置,就在我指向刚刚那的点的瞬间,世界原点恢复到了以前那个位置,同时也恢复了个人自定义锚点,这样我就拥有了与以前如出一辙的 AR 体验:
后面我能够无数次重启这个 app,每一次都会展现与以前彻底相同的体验。World Map 固然也能够分享给其余设备,这就是持久化功能。
以上就是保存和加载地图功能的介绍,为 ARKit 带来了持久化和多人体验。除了保存和加载地图,世界追踪还在如下方面进行了提高:
除了上面这几项,iOS 还有不少其余专为 AR 体验而进行的优化,例如:
除了 4:3 视频格式之外的全部优化都会应用到 App Store 目前的 app 上,若是想使用 4:3 视频格式,则须要用新的 SDK 从新构建 app。
为了提高用户体验,咱们推出了用于渲染的环境纹理,能够极大地提高用户体验。
假设设计师很是努力地建立了这样一个虚拟物体,准备用在 AR 场景里:
首先,咱们须要作下面这些事情:
这是上面那个虚拟物体在加强现实场景中的显示效果:
能够看到,尺寸恰当,但更重要的是,在物体表面能够看到周围环境的反射,右面能够看到黄色的香蕉和橙子的反射,左面则能够看到绿叶的反射,中间还能看到板凳表面的反射,这些就是 ARKit 2 的环境纹理的强大功能。
环境纹理功能会获取场景的纹理信息,一般状况下用 cube map 来表示,但有时候也会用其余格式表示,这个 cube map 还能够用做渲染引擎的 reflection probe,把纹理信息应用到虚拟物体上,就像上面那盆水果同样,极大地提高了可反光的物体的视觉效果。
ARKit 在运行时经过世界追踪和场景理解持续学习环境中的信息:
经过计算机视觉提取纹理信息并填充 cube map,并将 cube map 精确地放置在场景中。注意,上面的 cube map 只被填充了一部分,但要将其设置为 reflection probe 的话,则须要被彻底填充。要获得一个彻底填充的 cube map,须要完全扫描身边的物体空间,例如 360 度转一圈,就像作一张全景图同样。但这样对于用户来讲太难了,因此 ARKit 会借助先进的机器学习算法来自动填充 cube map,让这一切变得至关容易:
补充一句,以上这些计算都是在本地实时进行的。
有了 cube map 后就能够将其设置为 reflection probe,而后把虚拟物体放进场景,它们就会开始反射环境了:
以上就是对环境纹理功能的工做原理的简单介绍,借助 ARKit API,使用起来也很是简单,只要在 ARWorldTrackingConfiguration 里将 environmentTexturing 属性设置为 automatic 而后运行:
就这么简单!
而后 ARSession 会在后台自动处理环境纹理,并将环境纹理提供为 environment probe anchor。
AREnvironmentProbeAnchor 是 ARAnchor 的 extension,意味着它有 6 自由度的位置与角度 transform。此外,它还有一个 MTLTexure 格式的 cube map:
ARKit 还提供了 cube map 的物理范围,也就是 reflection probe 的影响范围,渲染引擎会借助它来纠正视差,好比物体在场景中移动时会自动适应新的位置,并反射环境中新的纹理。
AREnvironmentProbeAnchor 的生命周期和其它 anchor 相同,例如 ARPlaneAnchor 和 ARImageAnchor。
此外,AREnvironmentProbeAnchor 还被彻底整合进了 ARSCNView,若是你的渲染引擎是 SceneKit,那就只要在 WorldTrackingConfiguration 里启用这个功能就行了,其他的工做 ARSCNView 会自动搞定。
对于更复杂的使用场景,可能须要在场景里手动放置 AREnvironmentProbeAnchor,这时须要把 environmentTexturing 属性设置为 manual:
而后能够按照理想的位置和角度将 AREnvironmentProbeAnchor 添加到 ARSession 对象中,ARSession 得到更多有关环境的信息时会更新其纹理。
下面这个小 Demo 展现了环境纹理是如何真实地渲染 AR 场景的。放上以前那个模型,先来看一下未启用环境纹理的状况:
能够在底部的开关上看到目前采用的是环境光估算,看起来还能够,摆在桌上,有天然的阴影,但缺乏的就是对木头桌子的反射。若是在旁边再放点东西:
虚拟物体并无反射出这个水果。下面启用环境纹理功能:
能够看到,启动环境纹理功能后物体马上开始反射木头桌子和香蕉的纹理,极大地提高了 AR 场景的效果,看起来很是理想,就像真的在桌上同样。
以上就是 ARKit 2 强大的环境纹理功能,让 AR 场景变得异常真实。
iOS 11.3 引入了图像检测功能,做为世界追踪的一部分。图像检测会搜索场景中指定的 2D 图像,但这些图像必须是静止的、不能被移动,例如电影海报或博物馆里的画做。
ARKit 会估算被检测到的图像的位置和角度(6自由度),能够用来触发渲染场景中的内容。因为图像追踪是被彻底整合在世界追踪里的,因此只要设置一个属性就能够用了。
为了加载用于图像检测的图片,能够从文件中加载,也可使用 Xcode 的 asset catalog,asset catalog 能够提供图像的检测质量。
图像检测是一个很棒的功能,但在 iOS 12 里会由于图像追踪功能的加入变得更加出色。
图像追踪是对图像检测功能的一个补充,最大的好处就是图像再也不须要是静止的,能够移动:
ARKit 如今会以每秒 60 帧的速率估算每一帧的位置和方向,能够实际加强 2D 图像,例如杂志、桌游等等具备真实图片的东西。
ARKit 还能够同时追踪多个图像:
默认状况下只追踪一张图像,例如杂志封面。但若是是杂志的内页,则能够设置为同时追踪两张图像。
此外,iOS 12 和 ARKit 2 还带来了全新的 ARImageTrackingConfiguration,能够用来单独进行图像追踪,设置方法以下。
首先从文件或 asset catalog 中加载一组 Reference Image:
而后把这些 Reference Image 设置为 ARWorldTrackingConfiguration 的 detectionImages 属性:
或者设置为 ARImageTrackingConfiguration 的 trackingImages 属性:
而后用刚刚设置好的 configuration 来运行 session:
而后和以前同样,在 ARSession 运行时,每次更新都会提供 ARFrame:
若是图片被检测到了,ARFrame 则会包含 ARImageAnchor 对象:
ARImageAnchor 是一个可被追踪的对象,由于它符合 ARTrackable 协议,因此有一个布尔型的 isTracked 属性,指出当前图像的追踪状态,true 表示正在被追踪:
还有一个属性指向当前被检测到的图像,同时用一个 4x4 矩阵来表示位置和角度。
获取 Image Anchor 的第一步就是加载图像,那么应该选择怎样的图像呢?
这是一张来自儿童读物的图像:
这张图像对于图片追踪来讲很是理想,有清晰的特征、良好的纹理、鲜明的对比。
下面这张图片一样来自于儿童读物,但并不建议使用:
它有多个重复性结构、均匀的色域、狭窄的灰度直方图。但咱们不须要本身辨别这些图片是否存在问题,Xcode 会帮助咱们:
若是我把上面的图片导入 Xcode,会发现左侧那张图片没有警告,也就是说它是被建议使用的。然而右面那张 three kids reading 则出现了警告图标,说明不建议使用它,若是点击该图标,能够看到不建议用于图像追踪的详细缘由:
能够看到缘由和直方图、色域以及重复结构有关。
图片加载完以后,有两种方式配置图像追踪,第一种是使用 ARWorldTrackingConfiguration。
若是使用世界追踪中的图像追踪功能,image anchor 会以世界坐标系进行表示,也就是说 image anchor、plane anchor 以及世界原点都会处于同一坐标系中,它们之间的交互也会变得简单、直接。
第二种则是使用全新推出的 ARImageTrackingConfiguration,用于单独执行图像追踪。
也就是说 ARImageTrackingConfiguration 会从世界追踪中独立出来,不用依赖运动传感器也能够进行追踪,识别图像前也不须要初始化,此外还能够用在没法使用世界追踪的场景下,例如电梯或火车等正在移动的场所。
在这种配置下,ARSession 会以 60 帧一秒的速度估算位置和角度,实现起来也很是简单:
首先建立一个 ARImageTrackingConfiguration 类型的 configuration,而后指定须要追踪的图像数组,接下来还能够指定但愿追踪的图片数量。(须要注意的是,上面设置了三张须要追踪的图像,但将同时追踪的图像上限设置为了 2,因此若是已经追踪到了前两张图像,此时第三张图像进入画面的话,仍然可以收到 detection 的更新,但不会追踪第三张图像)。最后,用 configuration 运行 session。
如前文所述,还能够经过 World Tracking 实现图像追踪,只要替换图中高亮的两行代码便可:
图像检测和图像追踪之间的惟一区别就在于 maximumNumberOfTrackedImages,因此若是你的 app 正在使用图像检测功能,只要加上这一行,从新编译,就可使用全新的追踪功能了。
这个 demo 是一个 AR 相框 app,首先用 Xcode 生成一个 AR app 的模板:
接下来须要指定待检测的图像,一只叫 daisy 的猫咪:
在属性面板将此图片命名为 daisy,同时指定该图像文件在真实世界的尺寸,也就是相框的尺寸。此外还在 Xcode 中载入了一段 daisy 的视频:
下面,先建立一个 ARImageTrackingConfiguration 类型的 configuration:
而且使用 group name “Photos” 从 asset catalog 中载入了图像数组,数组中只有一张图像 “daisy”,而后将其设置为 configuration 的 trackingImages 属性,接下来把 maximumNumberOfTrackingImages 属性设置为 1。
若是此时运行这个 app,ARSession 已经能够在图片被检测到时提供 ARImageAnchor 了,但还须要再增长点内容——建立一个 AVPlayer 来加载 Resource Bundle 中视频:
下面把它覆盖到现实中的图片上:
首先检测 imageAnchor 的类型是不是 ARImageAnchor,而后使用与被检测到的图像相同的物理尺寸建立一个平面,而后把 videoPlayer 设置为平面的纹理,并让视频开始播放。接下来用平面几何体来建立 SCNNode,并旋转使其与 anchor 的坐标系相匹配。
就是这样,运行!
能够看到,就在我把猫咪相框放进屏幕的瞬间视频就开始播放了,猫咪在里面动来动去。因为 ARKit 会实时估算位置,因此能够任意移动设备,每一帧都会相应更新。
以上就是对 ARKit 中图像追踪功能的介绍,使用起来很是简单。
图像追踪适用于 2D 图像,但 ARKit 不仅局限于此,物体检测功能能够用于检测场景中给定的 3D 物体。
和图像检测同样,物体检测只适用于没法移动的静态物体,例如博物馆里的展品、某些指定的玩具或是家庭物品等等。
此外,与图像检测不一样的是,物体检测须要先用运行 ARKit 的 iOS app 扫描该物体。幸运的是,Apple 为咱们提供了彻底开源的、功能齐全的 iOS app 用于扫描本身的 3D 物体,这些物体须要有一些特征,例如拥有良好的纹理、硬性而且不会反光。
ARKit 能够估算这些物体的位置和角度(6自由度)。
同时,物体追踪功能被彻底整合进了世界追踪功能中,因此只要设置一个属性,就能够开始进行物体追踪了。设置方法以下:
从文件或 Asset Catalog 中加载 ARReferenceObject 数组,而后将其设置为 ARWorldTrackingConfiguration 的 detectionObjects 属性:
configuration 设置完成以后,运行 session:
和图像检测同样,每次更新都会得到 ARFrame:
若是检测到了场景中的物体,ARFrame 就会包含 ARObjectAnchor:
ARObjectAnchor 是 ARAnchor 的一个简单子集:
transform 表示 6 自由度的位置和角度,同时还会经过 referenceObject 指出被检测到的物体。
只要三行代码就能够实现:
首先建立一个 ARWorldTrackingConfiguration 类型的 configuration,而后指定想要检测的物体数组(古代半身雕像以及陶罐),最后用它来运行 session。
上面的代码最终构成了一个简单的 AR 博物馆 app:
这个半身雕像进入 iOS 的视图中后,能够获得 6 自由度的 pose,利用它在雕像头顶浮现一个很是简单的信息图形,包括这位埃及女王的姓名(Nefertiti)以及她的出生日期,固然还能够添加任意渲染引擎支持的内容。
为了构建这个 app,我须要先扫描这个物体。物体扫描会收集场景中的信息,和平面检测相似,经过收集场景中的信息来估算水平面或垂直面的位置,这里则是获取有关 3D 对象的信息。
为了指定物体检测的区域,会生成 transform、extent 和 center,这样能够在物体周围造成一个立体边框,定义了它在场景中的位置。
Xcode asset catalog 完美支持提取出的对象,便于导出到其它 app 并进行复用。
Apple 还针对扫描功能推出了全新的 ARObjectScanningConfiguration,但咱们并不须要本身写扫描 app,由于 Apple 开源了一个功能齐全的扫描 app,叫作 Scanning and detecting 3D objects。下面是这个 app 的工做方式:
如今咱们要为上面的 Nefertiti 雕像建立立体边框,外边框并不须要很精确,由于真正重要的是边框内部那些特征点。
对外边框感到满意以后,就能够点击 Scan 按钮开始扫描物体了,能够看到进度在不断增长,表示物体被扫描的程度:
须要注意的是,并不必定要把物体的每一面都扫描下来,例如博物馆里的某些靠着墙壁的雕塑,没法从背后进行扫描,那一面就能够不扫。
对扫描感到满意以后,能够调整 extent 的 center(与物体的原点相对应),惟一的要求就是 center 要留在 extent 内部。
最后,扫描 app 还能够执行检测测试:
上图中的检测测试在多个视角下都经过了,说明扫描很成功。我还建议把物体移动到其它位置进行检测测试,看看在不一样的材质和光照状况下可否成功:
扫描完成后会得到一个 ARReferenceObject 类型的对象(在以前的图表里提到过):
这个对象能够被序列化为文件,后缀名通常是 .arobject,name、center 和 extent 属性能够在 asset catalog 里查看。此外还能够获得以前扫描区域的全部原始特征点。
以上就对物体检测功能的介绍,记住在检测以前要先扫描一遍物体,扫描 app 全部的源码都是开源的,如今就能够下载。
去年发布 iPhone X 的同时,ARKit 也推出了健壮的面部识别和追踪功能,每一帧都会估算面部的角度和位置(速度为每秒60帧),获得的 pose 能够用于加强用户面部,例如增长面具、帽子甚至是替换脸部材质。ARKit 还会以 ARFaceGeometry 格式提供面部三角网格:
面部追踪的主要锚点类型是 ARFaceAnchor,包含了面部追踪所需的全部信息。为了更真实地渲染,ARKit 还会提供方向性光线估算,将面部用做光线探测器(light probe),估算光线强度、方向以及色温:
光线估算对于大部分 app 来讲很是够用了,但对于有更复杂业务需求的 app,ARKit 会收集整个场景的光线状况并提供球面谐波系数(spherical harmonics coefficient),能够进一步提高视觉效果。
ARKit 还能够实时追踪表情,支持超过 50 种特定的 blendshape (面部特征点),blenshape 会假设一个介于 0 和 1 之间的值来表示对应面部特征点的活跃程度,1 表示极度活跃,0 表示不活跃。例如张开嘴时 jawOpen 系数会接近 1,闭嘴时则接近 0。blendshapes 对于创造虚拟角色动画来讲很是有用,例如结合使用 jawOpen、eyeBlinkLeft 和 eyeBlinkRight 系数就可让下面这个小方盒角色动起来:
但还能够更进一步:
建立 Animoji 的时候会使用不少其它 blendshapes,经过右边的蓝色柱状图得到头部 pose,而后映射到那只熊猫上,ARKit 为你提供了建立虚拟卡通角色动画所需的一切信息,和 Animoji 同样。
ARKit 2 增长了凝视追踪(gaze tracking)功能,会以 6 自由度追踪左右眼球:
两个 6 自由度的 transform 是 ARFaceAnchor 的属性,还有一个属性叫作 lookAtPoint,估算了两个眼球的凝视方向在面部坐标空间中的交汇点:
能够用这些信息给虚拟角色生成动画,或者做为 app 信息输入的全新交互方式。
此外 ARKit 2 还支持了舌头检测:
舌头是一种全新的 blendshape,1 表示舌头伸出,0 表示没有伸出:
tongueOut 系数能够用在虚拟角色的动画中,固然,也能够用做 app 的交互方式(笑
强大的保存和加载地图功能可让咱们得到持久化体验以及多人体验,世界追踪功能的提高可让平面检测变得更快、更精确,同时还提供了全新的视频格式。环境纹理功能能够收集场景的材质并应用到物体上,让物体看起来更加真实,与场景融为一体。此外还有全新的 2D 图像追踪功能,以及 3D 物体检测功能。面部追踪功能则推出了全新的“凝视追踪”以及“舌头追踪”。
两个新增的 session configuration,ARImageTrackingConfiguration 用于独立图像追踪,ARObjectScanningConfiguration 则用于物体扫描。此外还有一些用于与 ARSession 交互的补充类型:
ARAnchor 用于表示现实世界中的某个具体位置,新增了两个全新类型:
查看更多 WWDC 18 相关文章请前往 老司机x知识小集xSwiftGG WWDC 18 专题目录