You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iPhone/iPad下RealityView全屏覆盖时相机画面不显示的问题求助

iPhone/iPad下RealityView全屏覆盖时相机画面不显示的问题求助

我之前碰到过一模一样的问题,这本质是AR会话资源冲突导致的——iOS系统默认一个应用同时只能运行一个活跃的AR会话。当你通过fullScreenCover弹出ChildView时,ParentView里的RealityView已经占用了AR会话资源,ChildView尝试创建新的会话时无法获取相机权限,就会出现黑屏;而直接显示ChildView时,只有一个会话在运行,系统能正常分配相机资源,所以一切正常。

给你几个可行的解决方案:

方案1:共享AR会话(推荐)

在ParentView中创建一个全局的ARSession实例,传递给ChildView,让两个RealityView共用同一个会话,这样就能复用相机feed,避免冲突。

修改后的代码如下:

import RealityKit 
import SwiftUI 

struct ParentView: View{ 
    @State private var showIt = false
    // 创建共享的AR会话
    @State private var arSession = ARSession()

    var body: some View{ 
        ZStack{ 
            RealityView{content in 
                content.camera = .virtual 
                content.session = arSession // 绑定共享会话
                let box = ModelEntity(mesh: MeshResource.generateSphere(radius: 0.2),materials: [createSimpleMaterial(color: .red)]) 
                content.add(box) 
            } 
            Button("Click here"){ 
                showIt = true 
            } 
        } 
        .fullScreenCover(isPresented: $showIt){ 
            ChildView(session: arSession) // 传递会话给ChildView
                .overlay( 
                    Button("Close"){ 
                        showIt = false 
                    }.padding(20), alignment: .bottomLeading 
                ) 
        } 
        .ignoresSafeArea(.all) 
    } 

    // 补充你原来的createSimpleMaterial方法(假设你有这个实现)
    private func createSimpleMaterial(color: UIColor) -> SimpleMaterial {
        return SimpleMaterial(color: color, isMetallic: false)
    }
} 

import ARKit 
import RealityKit 
import SwiftUI 

struct ChildView: View{ 
    let session: ARSession // 接收共享会话

    var body: some View{ 
        RealityView{content in 
            content.camera = .spatialTracking
            content.session = session // 使用共享会话
        } 
    } 
}

方案2:手动管理会话的暂停与恢复

如果你不想共享会话,可以在弹出ChildView时暂停ParentView的会话,关闭时恢复,确保同一时间只有一个会话活跃:

// ParentView中修改fullScreenCover部分
.fullScreenCover(isPresented: $showIt, onDismiss: {
    // 关闭ChildView时恢复ParentView的会话
    arSession.run(ARConfiguration())
}){ 
    ChildView() 
        .overlay( 
            Button("Close"){ 
                showIt = false 
            }.padding(20), alignment: .bottomLeading 
        )
        .onAppear {
            // 显示ChildView时暂停ParentView的会话
            arSession.pause()
        }
} 

注意这种方法需要你在ParentView中同样持有arSession实例,并在RealityView中绑定它。

这两种方法都能解决你遇到的黑屏问题,推荐第一种共享会话的方式,它的体验更流畅,不会有会话切换的卡顿感。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:23:03