WWDC25

2025 年 6 月 29 日

探索 visionOS 26 空間場景的新境界:從智慧鎖定到遠端沉浸式渲染實戰

已複製到剪貼板


空間運算的體驗轉折點

在空間運算的開發實務中,「存在感」與「持續性」一直是衡量使用者體驗的核心指標。早期的開發挑戰在於,虛擬內容往往像是一層漂浮在現實上的濾鏡,一旦使用者關閉 App 或移動位置,原有的上下文關聯就會斷裂。

WWDC 2025:Set the scene with SwiftUI in visionOS
WWDC 2025:Set the scene with SwiftUI in visionOS

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 相同的 Window API。這對於視訊通話或遊戲視窗等「不應被重複開啟」的介面至關重要
  • 精確的還原決策:透過 .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:透過 SurfaceSnappingInfo API,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 之間如同兩個平行世界,現在透過 CompositorContent builder,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 資訊架構?它是該成為一個隨傳隨到的工具,還是該設計成一個安靜駐守在特定物理空間、具備環境感知能力的數位裝置?

分享文章

已複製到剪貼板

主題文章

查看 WWDC25

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章