Breakfast Finder示例代码导入新xcodeproj项目后出现白屏如何解决?
问题:Breakfast Finder示例代码导入新Xcode项目后相机流白屏
需求目标
计划将苹果官方Breakfast Finder示例代码的物体检测功能应用到自有应用中,将个人训练的模型加入原示例代码运行时,可正常检测物体并展示标签。
遇到问题
将该示例代码导入新建xcodeproj测试项目时,仅弹出相机权限申请弹窗,之后显示白屏,无法加载实时相机流。
复现步骤
- 复制了ViewController、ViewObjectRecognitionViewController两个Swift文件到项目中
- 将Preview View的引用出口关联到ViewController第17行定义的@IBOutlet
- 导入了示例代码自带的mlmodel文件
- 在Info文件中添加了带取值的NSCameraUsageDescription权限声明
额外测试:直接复制示例代码的所有文件(Swift、plist、mlmodel等)到新项目,排查连接问题后仍出现同样故障。
运行环境
测试设备为运行iOS 15的iPhone XR,开发者此前未接触过实时相机流开发。
故障原因及排查方案
按优先级从高到低排序,依次检查以下配置:
- UI生命周期配置不匹配
官方示例采用SceneDelegate管理UI入口,你新建的Xcode项目如果使用默认模板,需要确认Info.plist中Application Scene Manifest下的初始场景配置和示例代码完全一致,尤其是初始ViewController的类名是否和导入的文件匹配。如果你的项目删除了SceneDelegate改用AppDelegate管理根控制器,需要手动在application(_:didFinishLaunchingWithOptions:)方法中将相机相关ViewController设置为根视图,不要使用Main.storyboard的默认入口。 - AVCaptureSession未在后台队列运行
相机捕获会话不能在主线程执行,否则会阻塞UI导致预览无法渲染。检查代码是否存在后台队列初始化和会话调度逻辑:
// 专门的相机会话串行队列 private let sessionQueue = DispatchQueue(label: "com.example.camera.sessionQueue") // 会话启动放到后台队列执行 sessionQueue.async { [weak self] in self?.captureSession.startRunning() }
- 预览容器View配置错误
确认你关联IBOutlet的Preview View是示例代码中自定义的子类,其layerClass设置为AVCaptureVideoPreviewLayer:
class PreviewView: UIView { override class var layerClass: AnyClass { AVCaptureVideoPreviewLayer.self } var previewLayer: AVCaptureVideoPreviewLayer { layer as! AVCaptureVideoPreviewLayer } }
如果用普通UIView作为预览容器,会因为没有承载相机流的图层导致白屏。
4. 权限回调分支缺失
权限申请通过后需要手动触发会话启动逻辑,检查权限状态判断代码,确认当权限为.authorized时确实调用了captureSession.startRunning()方法,没有遗漏分支。
5. 系统框架依赖缺失
查看项目Build Phases > Link Binary With Libraries,确认已添加AVFoundation.framework和CoreML.framework,部分新建项目默认不会导入这两个依赖,会导致相机会话初始化静默失败。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

