近日,多名使用 .NET 10 进行跨平台移动开发的工程师反映,在将 UIImagePickerController 作为子视图控制器嵌入到应用界面中以调用相机功能时,系统会无端弹出一个 UIAlertViewController,提示“Flash Is Disabled”(闪光灯已禁用)。该提示即使设备闪光灯处于未开启状态或硬件根本不支持闪光灯时依然出现,严重干扰了正常拍照流程。

问题重现:简单嵌入即触发弹窗

据开发者反馈,问题在 iOS 17 及以上系统版本的实机测试中频繁复现。典型场景是:开发者使用 .NET MAUI(Multi-platform App UI)框架下的 UIImagePickerController 封装相机功能,并通过 AddChildViewController 方法将其嵌入到自定义的父容器中。启动相机后,页面正常显示取景画面,但紧接着会弹出警告对话框,内容为“Flash Is Disabled”,且只有“OK”按钮可供点击。点击后对话框消失,但相机功能似乎未受影响,只是用户体验大打折扣。

有开发者尝试在调用 UIImagePickerController 前手动设置 cameraFlashMode.off.auto,但问题依然存在。甚至在某些 iPad 型号(无闪光灯硬件)上,该提示同样出现,说明此弹窗并非真实硬件状态反映,而是一个误报。

技术深挖:API 调用顺序与权限冲突

业内 iOS 开发专家初步分析认为,该问题可能与 .NET 10 中 UIImagePickerController 的初始化时机有关。在原生 iOS 开发中,当 UIImagePickerController 作为模态控制器弹出时,系统会自动根据设备闪光灯能力显示或隐藏相关 UI 控件;但当其以子视图控制器(Child View Controller)的形式被添加到视图层级中时,系统对相机配置的感知流程可能出现偏差。

具体而言,UIImagePickerControllerviewDidLoad 时会尝试获取当前闪光灯状态并读取相关设置。若在该时刻 AVCaptureDevice 的闪光灯属性尚未完全初始化,或应用未获得必要的相机权限,系统可能错误地认为闪光灯已被禁用,进而触发内置的警告逻辑。而 .NET 10 的包装层在调用 AVFoundation 框架时,可能改变了对 AVCapturePhotoOutput 默认配置的处理顺序,导致这一误判被放大。

此外,部分开发者指出,该警告并非来自开发者自定义代码,而是 UIImagePickerController 内部 UIAlertController 自动弹出的结果,这进一步印证了与框架底层逻辑直接相关。

社区反馈:临时解决与官方等待

在 GitHub 的 .NET MAUI 仓库以及 Stack Overflow 上,已有多个相关议题被提出。当前社区给出的临时解决方案包括:

  1. 延迟加载相机:在将 UIImagePickerController 添加到父控制器之前,先将其 view 属性加载到内存中,让系统完成内部初始化,例如先执行 _ = pickerView.View;
  2. 拦截 Alert 事件:通过运行时 hook 或分类方法,在 UIAlertController 出现前判断其标题是否为“Flash Is Disabled”,如果是则手动取消。但此方法被认为不够优雅,且可能违反 App Store 审核规则。
  3. 改用原生模态弹出:放弃子控制器嵌入方式,改用 PresentViewController 全屏模态展示相机。不过对于需要自定义相机界面布局(例如加入水印、滤镜)的开发者来说,这并不理想。

微软 .NET 工程团队尚未就此发布官方声明。有内部人士在开发者论坛中透露,该问题已被标记为“待验证”,预计在 .NET 10 的后续预览版或补丁更新中修复。但考虑到 .NET 10 仍处于预览阶段,正式发布前出现此类兼容性 Bug 并不意外。

展望:跨平台开发仍需磨合

此次事件再次提醒开发者,在采用 .NET MAUI 等跨平台框架进行原生功能调用时,需要对平台底层的初始化顺序和生命周期有充分认知。UIImagePickerController 是 iOS 开发中极为成熟的组件,但其与 .NET 运行时之间的桥接层难免存在细节差异。随着 .NET 10 正式版临近,期待微软能尽快推出稳定补丁,并完善对原生嵌入场景的测试覆盖。

对于正在使用 .NET 10 开发相机相关应用的团队,建议在官方修复前优先采用上述临时工作区,或考虑在 iOS 端使用原生 AVCaptureSession 自定义相机视图,以彻底绕过 UIImagePickerController 的这一误判行为。技术的演进总是在发现问题与解决问题中前进,这一路上的“闪光灯”虽有小插曲,但终将照亮更稳定的跨平台之路。