Xamarin.iOS调用AVCaptureDeviceInput.FromDevice获取视频时崩溃如何解决?
问题原因及解决方案
1. 核心崩溃原因:缺少相机权限
从原生崩溃栈出现的TCC.framework可直接定位问题:iOS系统要求访问相机前必须先获取用户授权,且需要在项目Info.plist中配置相机使用说明。如果未完成权限配置直接调用*AVCaptureDeviceInput.FromDevice*,系统会直接杀死应用,不会抛出可被C#层捕获的托管异常。
你需要先完成以下配置和流程调整:
- 在
Info.plist中添加NSCameraUsageDescription项,值填写向用户说明相机使用目的的文本,例如"需要访问相机以扫描二维码" - 初始化相机前先检查权限状态,用户授权通过后再执行
SetUp方法中的相机初始化逻辑,权限检查示例代码:
var status = AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video); if (status == AVAuthorizationStatus.NotDetermined) { AVCaptureDevice.RequestAccessForMediaType(AVMediaType.Video, granted => { if (granted) { // 授权通过,执行相机初始化 SetUp(); } }); } else if (status == AVAuthorizationStatus.Authorized) { // 已有权限,直接初始化 SetUp(); }
2. 代码中的致命错误:Handle属性无限递归
你当前实现的Handle属性:
public IntPtr Handle => this.Handle; //_session.Handle;
属于典型的无限递归,只要有代码访问该属性就会直接触发栈溢出崩溃。请直接修改为注释中需要返回的会话句柄:
public IntPtr Handle => _session?.Handle ?? IntPtr.Zero;
3. 其他优化建议
- 调用
AVCaptureDeviceInput.FromDevice后需要校验返回值和输出的error参数,避免后续逻辑用到空对象 - 建议先初始化
AVCaptureSession,再依次配置输入、输出对象,符合苹果官方推荐的会话配置顺序 - 后续给
ConfigureComponents方法添加输入输出到会话的逻辑时,需要调用_session.BeginConfiguration()和_session.CommitConfiguration()包裹配置代码
内容的提问来源于stack exchange,提问作者canderse
相关产品推荐
相关产品推荐

