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

Xamarin.iOS中AVCaptureMetadataOutput属性声明差异及使用疑问

Xamarin.iOS AVCaptureMetadataOutput属性绑定问题解答

声明正确性判断

苹果官方的Objective-C声明是原生的正确定义,你所看到的返回单个AVMetadataObjectType的C#声明是旧版本Xamarin.iOS的绑定bug,该问题在Xamarin.iOS 8.10及后续正式版中已经完成修复,修复后的正确绑定签名为:

public virtual AVMetadataObjectType[] AvailableMetadataObjectTypes { get; }

产生错误的原因是早期Xamarin绑定工具在处理带枚举泛型约束的NSArray返回值时,映射逻辑出错,误将数组类型绑定为了单枚举值。

Xamarin.iOS环境下的正确用法

首先确认本地开发环境的Xamarin.iOS版本≥8.10,避免触发旧版本的绑定问题,常规使用示例如下:

using AVFoundation;
using Foundation;

// 初始化捕获会话逻辑省略
var captureSession = new AVCaptureSession();
var metadataOutput = new AVCaptureMetadataOutput();

if (captureSession.CanAddOutput(metadataOutput))
{
    captureSession.AddOutput(metadataOutput);
    // 获取当前设备支持的所有可识别元数据类型
    var supportedMetadataTypes = metadataOutput.AvailableMetadataObjectTypes;
    
    // 示例:仅开启二维码识别,先判断当前设备是否支持
    if (supportedMetadataTypes.Contains(AVMetadataObjectType.QRCode))
    {
        metadataOutput.MetadataObjectTypes = AVMetadataObjectType.QRCode;
        // 后续设置识别代理、启动会话等逻辑省略
    }
}

如果仍在使用未修复该问题的旧版本Xamarin.iOS,建议优先升级版本,也可以通过手动调用ObjC Runtime的方式直接获取原生返回值绕过绑定错误。

NSSet对应的C#等效类型

在Xamarin.iOS的绑定体系中对应两种情况:

  • 调用原生iOS API时,NSSet对应的绑定类型是Foundation.NSSet,泛型版本为Foundation.NSSet<T>
  • 做.NET层通用逻辑开发时,和NSSet语义等效的基类库类型是System.Collections.Generic.HashSet<T>,Xamarin提供了二者的互转扩展方法。

内容的提问来源于stack exchange,提问作者canderse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:03