Apple Vision Pro发布之后,我第一时间入手了一台,也第一时间开始学习visionOS开发。

作为一个做了多年iOS开发的人,我对苹果的新平台总是充满热情。从iOS到watchOS到tvOS,每一个新平台我都在第一时间学习和尝试。visionOS作为苹果的下一代计算平台,我当然也不会错过。

但这次的开发经历,和以往都不太一样。从兴奋入门到差点放弃,再到慢慢找到感觉,整个过程充满了挑战和意外。这篇文章就来聊聊我做visionOS开发的真实经历,有收获也有吐槽,希望能给想进入这个领域的开发者一些参考。

入门:全新的开发范式

刚开始学visionOS开发的时候,我是很兴奋的。

苹果为visionOS提供了一套全新的开发框架,叫SwiftUI for visionOS。如果你已经会用SwiftUI开发iOS应用,上手visionOS会比较快,因为基本的语法和组件都是一样的。但visionOS有很多独特的概念和API,需要重新学习。

第一个新概念是"空间"。在iOS上,你的应用运行在一个矩形的屏幕里;在visionOS上,你的应用可以存在于三维空间中。你可以把窗口放在用户面前的任何位置,可以调整窗口的大小和位置,甚至可以把内容"附加"到用户周围的环境中。

第二个新概念是"沉浸度"。visionOS应用可以在不同的沉浸度下运行。混合模式下,用户可以看到周围的真实环境,应用窗口漂浮在空间中;完全沉浸模式下,真实环境被隐藏,用户进入一个完全虚拟的空间。你可以在应用中动态调整沉浸度,实现从混合现实到完全虚拟现实的平滑过渡。

第三个新概念是交互方式。visionOS没有触摸屏,用户用眼睛和手势来交互。看哪里就是选中哪里,捏合手指就是点击,挥手可以滚动页面。你需要用苹果提供的焦点系统和手势识别API来处理这些交互,和iOS上的触摸交互完全不同。

第四个新概念是RealityKit和Reality Composer Pro。要在visionOS中展示3D内容,你需要用RealityKit框架,还要用Reality Composer Pro这个工具来创建和编辑3D场景、材质、动画。这对没有3D开发经验的人来说,是一个不小的门槛。

我花了大概两周的时间,把官方文档和示例项目过了一遍,做了几个简单的demo。那时候觉得,visionOS开发虽然有新概念,但整体还是苹果的风格——文档完善、工具链成熟、API设计优雅。我觉得自己已经入门了,可以开始做真正的应用了。

第一个坑:空间设计的思维转变

真正开始做应用的时候,第一个坑就来了:空间设计的思维转变。

做iOS开发这么多年,我已经习惯了在一个固定大小的矩形屏幕里布局。但在visionOS中,没有"屏幕"这个概念,你的内容存在于三维空间中。窗口可以放在任何位置,可以有任意大小,用户可以走近看、走远看、从不同角度看。

这带来了很多新的设计问题。比如,窗口应该放在哪里?离用户多远合适?多大的尺寸是舒适的?用户转头的时候窗口要不要跟着动?多个窗口之间怎么布局?3D物体应该放在什么位置?多大的比例才自然?

这些问题没有标准答案,需要你自己去摸索和测试。苹果的人机界面指南(HIG)给了一些建议,比如推荐的观看距离是1到3米,推荐的窗口大小是类似iPad的尺寸,但具体到每个应用,还是需要根据内容来调整。

我做第一个应用的时候,就犯了很多空间设计的错误。比如把窗口放得太近,用户看久了会累;把3D物体放得太大,用户转头才能看到全部;交互按钮放得太偏,用户需要费力地转头才能看到。这些问题在模拟器里看不出来,只有戴上设备实际使用的时候才能发现。

后来我学会了一个方法:每做一个界面,就立刻在真机上测试,感受空间感和舒适度。不要在模拟器里调半天,因为模拟器里的感觉和真机完全不一样。visionOS开发,真机测试是必须的,模拟器只能用来做基本的功能验证。

第二个坑:眼动和手势交互的细节

visionOS的交互方式看起来很自然——看哪里选中哪里,捏合手指点击。但实际开发起来,细节非常多。

第一个问题是焦点系统。在visionOS中,系统会根据用户的视线自动管理焦点,你不需要手动处理。但有时候你需要自定义焦点行为,比如让某个元素默认获得焦点,或者在特定情况下转移焦点。苹果提供了一些API来控制焦点,但用起来比想象中复杂,特别是在有多个窗口、多个3D物体的场景下,焦点的行为经常和预期不一样。

第二个问题是手势识别。visionOS支持多种手势:捏合点击、捏合拖动、双指捏合缩放、手掌张开等等。系统会自动处理标准控件的手势,但如果你要做自定义的3D交互(比如拖动一个3D物体、旋转一个模型),就需要自己用手势识别API来处理。这里的坑很多,比如手势和系统手势的冲突、手势的精度和延迟、多个手势的优先级等等。

第三个问题是输入的精度。用眼睛和手势交互,精度肯定不如鼠标和触摸屏。用户看一个按钮,可能因为视线的微小抖动而选中了旁边的按钮;用户捏合手指,可能因为动作不标准而没有被识别。这就要求你在设计界面的时候,把按钮和可交互元素做得足够大,间距足够宽,给用户足够的容错空间。这和iOS上的设计原则类似,但在visionOS中要求更高。

第四个问题是疲劳。用眼睛和手势交互,时间长了会累。特别是需要频繁转头、频繁抬手操作的应用,用户用十几分钟就会觉得累。所以visionOS应用的交互设计要尽量减少用户的动作,能用视线完成的就不要用手势,能用一次操作完成的就不要让用户多次操作。

这些交互细节,只有在真机上实际使用的时候才能体会到。我在开发过程中,经常是在模拟器里觉得交互很流畅,一到真机上就发现各种问题,然后反复调整。

第三个坑:3D内容的制作和优化

visionOS的核心是空间计算,而空间计算离不开3D内容。但对大多数移动端开发者来说,3D内容制作是一个完全陌生的领域。

我在做应用的时候,需要一些3D模型和场景。一开始我想自己用Reality Composer Pro来做,但发现这个工具虽然比专业的3D软件简单,但还是有学习曲线。你需要了解3D建模的基本概念:网格、材质、纹理、光照、动画、物理碰撞等等。这些东西不是看几天文档就能掌握的。

后来我决定从网上下载现成的3D模型。但新的问题来了:网上的3D模型格式各种各样(FBX、OBJ、GLTF等等),需要转换成RealityKit支持的USDZ格式。转换的过程中经常出问题:材质丢失、动画不工作、法线方向反了、模型比例不对。而且很多免费模型的质量不高,面数太多,在Vision Pro上运行不流畅。

即使有了合适的3D模型,性能优化也是一个大问题。Vision Pro的芯片虽然很强,但要实时渲染高分辨率的3D内容,还要处理眼动追踪和手势识别,性能压力不小。如果你的场景里有太多高面数的模型、太复杂的材质、太多动态光照,帧率就会下降,用户会感觉到卡顿和延迟,这在VR/AR设备中是非常影响体验的,甚至会导致眩晕。

我花了很多时间学习3D内容的优化:减少模型面数、使用LOD(细节层次)、合并材质、使用光照贴图、限制动态光源的数量。这些工作虽然繁琐,但对体验的提升很大。

我的建议是:如果你的团队里没有3D美术,尽量用简单的3D内容,或者从苹果官方的素材库中找模型。不要一开始就做很复杂的3D场景,先把基础的2D窗口应用做好,再逐步加入3D元素。

第四个坑:模拟器和真机的差异

visionOS开发中,模拟器和真机的差异比我想象的大得多。

在模拟器里,你用鼠标模拟视线,用键盘模拟手势,操作起来很方便。但模拟器里的空间感、交互手感、性能表现,和真机完全不一样。

我遇到过好几个"模拟器里正常,真机上出问题"的情况。比如有一个动画,在模拟器里很流畅,在真机上卡顿严重,后来发现是因为模拟器用的是Mac的GPU,性能比Vision Pro强很多。还有一个手势交互,在模拟器里用鼠标点击很正常,在真机上因为手势识别的精度问题,经常触发不了。还有一个3D模型,在模拟器里显示正常,在真机上材质发黑,后来发现是真机的GPU不支持某种材质特性。

这些问题让我意识到,visionOS开发不能依赖模拟器,必须频繁地在真机上测试。最好的开发流程是:在模拟器里做基本的功能开发和调试,然后立刻在真机上测试体验和性能,发现问题再回来修改。不要等功能全部做完了才上真机,那时候可能会发现很多根本性的问题需要返工。

还有一个问题是真机的部署和调试。Vision Pro的部署和iOS类似,用Xcode连接设备安装应用。但因为visionOS是新系统,Xcode的调试工具还不够完善,有些调试功能(比如查看3D场景的渲染状态、分析性能瓶颈)用起来不太顺手。希望后续的Xcode版本能改进。

第五个坑:应用生态和用户预期

visionOS是一个全新的平台,应用生态还很薄弱。这既是机遇也是挑战。

机遇是:竞争少,你的应用更容易被用户发现和下载。苹果也在大力扶持visionOS应用,有各种推广资源和激励计划。

挑战是:用户少,付费意愿不确定。Vision Pro的售价很高,用户基数不大。而且用户对visionOS应用的预期很高,他们期望的是真正的空间计算体验,而不是把iOS应用简单放大放到空间里。如果你的应用只是一个"放大版的iPad应用",用户会觉得没意思,不会买单。

我在做应用的时候,一直在思考一个问题:什么样的应用是真正适合visionOS的?不是所有的iOS应用都适合搬到visionOS上。有些应用(比如视频观看、3D展示、虚拟协作、教育培训)在空间计算中有天然的优势;而有些应用(比如文字处理、表格编辑、快速信息查看)在visionOS中反而不如手机和电脑方便。

我的体会是:visionOS应用的核心价值应该是"空间"带来的独特体验。比如把一个3D模型放在用户面前,让用户从各个角度观察;比如把多个窗口排列在空间中,让用户同时处理多个任务;比如把用户带入一个完全虚拟的环境,提供沉浸式的体验。如果你的应用用不到这些空间特性,那可能没必要做visionOS版本。

我为什么没有放弃

说了这么多坑,你可能觉得我要放弃visionOS开发了。但实际上,我没有放弃,反而越来越有兴趣。

因为虽然有很多坑,但visionOS开发也有很多让人兴奋的地方。

第一,这是一个全新的平台,一切都在起步阶段。你做的每一个应用,都可能是这个领域的"第一个"。这种探索的感觉,是在成熟平台上体会不到的。

第二,苹果的工具链和生态依然是最好的。SwiftUI、RealityKit、Xcode这些工具虽然有不完善的地方,但整体设计是优雅的、一致的。你能感受到苹果在这个平台上的投入和野心。

第三,空间计算确实代表了未来的方向。当你第一次把一个3D模型放在自己的客厅里,第一次在空间中同时打开多个窗口工作,第一次进入一个完全沉浸式的虚拟环境,你会真切地感受到:这就是未来。

我现在还在持续学习和开发visionOS应用,虽然进展不快,但每解决一个问题、每做出一个有趣的交互,都很有成就感。

给想入门的开发者的建议

如果你也想尝试visionOS开发,我有几个建议。

第一,先买设备。visionOS开发必须有真机,模拟器是不够的。如果预算有限,可以等价格更低的型号,或者和朋友合伙买一台。没有真机,你无法真正理解空间计算的体验。

第二,从SwiftUI开始。如果你已经会iOS开发,用SwiftUI做visionOS应用上手最快。先做一个简单的2D窗口应用,熟悉基本的开发流程,然后再逐步加入3D内容和空间交互。

第三,认真读HIG。苹果的visionOS人机界面指南写得很详细,包含了空间设计、交互设计、性能优化等各方面的指导。很多坑,如果你提前读了HIG,是可以避免的。

第四,多在真机上测试。不要在模拟器里调半天,尽早在真机上测试体验。空间感、交互手感、性能表现,只有在真机上才能感受到。

第五,从小而美的应用开始。不要一开始就想做一个很复杂的应用。先做一个简单的、能体现空间计算特色的小应用,把基础打牢,再逐步扩展。

第六,关注性能。visionOS对性能的要求很高,卡顿和延迟会严重影响体验,甚至导致眩晕。从一开始就要关注性能,及时优化,不要等最后再调。

写在最后

visionOS开发从入门到放弃,我经历了什么?

我经历了入门的兴奋——全新的平台、全新的范式、无限的可能性;经历了空间设计的思维转变——从矩形屏幕到三维空间,一切都要重新思考;经历了交互设计的细节——眼动和手势看起来自然,做起来全是坑;经历了3D内容的挑战——建模、优化、性能,每一个都是新领域;经历了模拟器和真机的差异——必须频繁真机测试;也经历了对应用生态的思考——什么样的应用才适合空间计算。

但我最终没有放弃。因为我看到了这个平台的潜力,感受到了空间计算的魅力。虽然现在还有很多不完善的地方,但我相信,随着设备的普及、工具的成熟、生态的完善,visionOS会成为一个重要的开发平台。

技术的发展总是这样,新平台刚出来的时候充满了机会,也充满了坑。早期进入的人会踩很多坑,但也会获得先发优势。如果你对空间计算感兴趣,如果你想在新平台上做一些有趣的东西,我鼓励你试一试。

也许你会和我一样,从入门到差点放弃,但最终会找到属于自己的方向。