空間運算的體驗轉折點
在空間運算的開發實務中,「存在感」與「持續性」一直是衡量使用者體驗的核心指標。早期的開發挑戰在於,虛擬內容往往像是一層漂浮在現實上的濾鏡,一旦使用者關閉 App 或移動位置,原有的上下文關聯就會斷裂。
visionOS 26 的場景(Scenes)管理更新,標誌著一個關鍵的體驗轉折點。這次的更新不僅僅是 API 的增補,而是對 Window(視窗)、Volume(體積)與 Immersive Space(沉浸空間)三大場景類型的底層邏輯重構。身為技術開發者,我們需要關注的是:Apple 正試圖讓虛擬內容具備如物理家具般的「空間記憶」。掌握這些新特性,能讓我們設計出的 App 從單純的「視窗集合」進化為「具備空間感知能力的數位裝置」。
場景生命週期的精細化控制:鎖定、還原與唯一性
為了強化內容的物理存續感,visionOS 26 引入了 macOS 玩家熟悉的生命週期控制項,並賦予其空間運算特有的屬性。
核心技術細節:Room Locking 與 Unique Windows
- 房間鎖定 Room Locking:使用者現在可以將視窗或體積鎖定在特定的物理房間。這意味著當你把一個數位時鐘掛在客廳牆上後去臥室,回來時它依然在那裡。這種「空間持久性」是由系統自動處理的,但開發者需要思考哪些場景值得被「記住」
- 唯一視窗 Unique Windows:過去我們習慣使用
WindowGroup來處理多個視窗實例,但 visionOS 26 現在支援與 Mac 相同的WindowAPI。這對於視訊通話或遊戲視窗等「不應被重複開啟」的介面至關重要 - 精確的還原決策:透過
.restorationBehavior(.disabled),我們可以排除如登入畫面或歡迎頁等暫時性 UI 被系統自動還原
開發者洞察:避免使用者陷入「狀態死胡同」
當主要視窗被關閉而輔助視窗(如工具箱)卻被系統鎖定還原時,使用者常會感到困惑。我建議在次要視窗上使用 .defaultLaunchBehavior(.suppressed)。這能確保使用者從主畫面重啟 App 時,不會只看到一個孤零零的工具欄,而能回到一個安全、預期的起始狀態。
// 使用 Window API 確保唯一性,並禁用不必要的狀態還原
Window("Welcome", id: "welcome") {
WelcomeView()
}
.restorationBehavior(.disabled)
.defaultLaunchBehavior(.suppressed) // 避免無主視窗的尷尬啟動
WindowGroup(id: "main-stage") {
MainStageView()
}
// 主要場景預設開啟還原,讓它在房間中「長存」
體積化空間的物理演進:表面貼齊與視覺邊界突破
Volume 場景在這次更新中突破了「虛擬盒子」的束縛,具備了更敏銳的物理感知能力。
核心技術細節
- 表面貼齊 Surface Snapping:透過
SurfaceSnappingInfoAPI,Volume 內容可以偵測並吸附於物理表面(如桌面或牆壁)。特別的是,開發者可以存取 ARKit 的表面分類資訊,但這需要在Info.plist設定Application Wants Detailed Surface Info為 YES,並提供Privacy - World-Sensing Usage-Description說明 - 視點感知 Volume Viewpoint:新的
onVolumeViewpointChange修飾符允許開發者偵測使用者與 Volume 的相對位置。當使用者繞到模型後方時,我們可以動態調整渲染(例如隱藏遮擋物),這對複雜的 3D 場景互動非常實用 - 非互動剪裁邊距 Clipping Margins:透過
preferredWindowClippingMargins,我們能讓裝飾性特效(如瀑布、雲霧)超出原有的邊界盒,增加視覺的流動感,而不影響核心互動區域
開發者建議
在使用 preferredWindowClippingMargins 時,務必記得這些邊距內容是「非互動性」的。開發者應配合 windowClippingMargins 環境變數來讀取系統實際核准的邊距,以避免特效在某些系統限制下被切斷。
@Environment(\.surfaceSnappingInfo) private var snappingInfo
var body: some View {
RealityView { content in
// 加載機器人 BOTanist
}
.onChange(of: snappingInfo.isSnapped) { oldValue, isSnapped in
// 如果貼齊桌面,自動隱藏底座,讓機器人直接「站在」實體桌上
if isSnapped && snappingInfo.authorizationStatus == .authorized {
updateModelForSurface(snappingInfo.classification)
}
}
.onVolumeViewpointChange { viewpoint in
// 根據使用者視角動態處理模型遮擋問題
}
}
沉浸式空間的界限突破:遠端開發與 Metal 渲染
對於追求極致體驗的開發者,visionOS 26 解決了兩個痛點:開發迭代效率與 Metal 渲染的狀態同步。
核心技術細節
- RemoteImmersiveSpace:配合 macOS Tahoe,開發者現在可以從 Mac 直接啟動並預覽 Vision Pro 上的沉浸式場景。這免去了漫長的打包傳輸時間,實現了近乎即時的跨平台開發反饋
- CompositorContent:這是本次更新的一大驚喜。過去 Metal 渲染(CompositorLayer)與 SwiftUI 之間如同兩個平行世界,現在透過
CompositorContentbuilder,Metal 渲染層也能存取 SwiftUI 的環境變數(如scenePhase)與修飾符 - 沉浸風格優化:Progressive 模式新增了「Portrait 直式」長寬比。這不僅適合手機遊戲移植,對於高動態內容,保持周邊環境的穩定感能有效減輕使用者的動暈症
洞察:世界重定位的處理
當使用者長按數位旋鈕進行 World Recentering 時,ARKit 的座標系會發生位移。透過 onWorldRecenter 修飾符,開發者可以即時捕捉此事件,重新計算虛擬物件在物理空間中的相對位置,避免內容在重定位後「飄走」。
跨場景銜接:UIKit 與 SwiftUI 的空間橋接 Scene Bridging
Apple 並未忘記廣大的 UIKit 開發者。透過場景橋接(Scene Bridging),即使是像 Safari 這樣複雜的現有 App,也能無縫整合 visionOS 的空間特性。
核心技術細節
- UIHostingSceneDelegate:這是橋接的門戶。開發者繼承此類別後,可以在
rootScene中定義 SwiftUI 的 Volume 或 Immersive Space - 啟動流程:使用
UISceneSessionActivationRequest時,指定hosting delegate class與目標場景的ID,即可從 UIKit 生命週期中啟動空間體驗。此 API 同樣適用於 macOS 的 AppKit,為跨平台開發提供了統一的路徑
// 定義橋接 Delegate
class SpatialDelegate: UIHostingSceneDelegate {
override var rootScene: some Scene {
WindowGroup(id: "volumetric-viewer") {
ModelDetailView()
}
.windowStyle(.volumetric)
}
}
// 在 UIKit 邏輯中觸發啟動
func openSpatialView() {
let request = UISceneSessionActivationRequest(
role: .window,
matching: nil,
options: nil
)
// 指定 Delegate 與 ID
request.hostingSceneDelegateClass = SpatialDelegate.self
request.sceneIdentifier = "volumetric-viewer"
UIApplication.shared.activateSceneSession(for: request)
}
場景設計的新準則
visionOS 26 的場景 API 演進,確立了空間 App 設計的三大準則:持久性(ersistence)、環境感知(Environment Awareness)以及跨平台靈活性(Platform Agility)。
當我們在建構新一代空間應用時,不應再受限於傳統視窗的框架。這次的更新讓我們有能力去思考:虛擬內容如何與物理世界產生深度連結?是「鎖定」在牆面上的工具,還是能「吸附」在桌面上的互動玩伴?
思考題:當虛擬視窗可以永遠鎖定在客廳角落時,你會如何重新設計你的 App 資訊架構?它是該成為一個隨傳隨到的工具,還是該設計成一個安靜駐守在特定物理空間、具備環境感知能力的數位裝置?
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。