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

如何在NSOpenPanel中使用setAllowedContentTypes设置多种文件类型

在macOS 12.2中给NSOpenPanel设置多种专属应用文件类型

没问题,针对你要限制NSOpenPanel仅允许打开自家应用专属文件的需求,我给你梳理一下具体实现步骤,确保精准又安全:

核心思路:用专属UTI而非单纯扩展名

单纯靠扩展名过滤容易和其他应用撞车,而你司注册的**统一类型标识符(UTI)**是系统认可的专属标识,能精准锁定属于你应用的文件。

具体实现步骤

  1. 确保Info.plist已注册专属UTI
    首先要在你应用的Info.plist里添加对应文件类型的注册信息,比如你有两种专属文件类型(假设UTI为com.yourcompany.ach和com.yourcompany.customdoc),需要添加CFBundleDocumentTypes数组,示例配置大概是这样的:

    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>ACH File</string>
            <key>LSHandlerRank</key>
            <string>Owner</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>com.yourcompany.ach</string>
            </array>
        </dict>
        <dict>
            <key>CFBundleTypeName</key>
            <string>Custom Document</string>
            <key>LSHandlerRank</key>
            <string>Owner</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>com.yourcompany.customdoc</string>
            </array>
        </dict>
    </array>
    

    这一步是让系统识别这些文件属于你司应用的前提。

  2. 在NSOpenPanel中设置允许的UTI数组
    接下来在代码里创建包含所有专属UTI的数组,然后赋值给allowedContentTypes即可。这里有两种方式获取UTI:

    • 直接使用注册好的UTI标识符(推荐)
      如果你已经明确知道UTI的字符串,可以直接构造数组:

      // 替换成你司实际注册的UTI
      NSArray *allowedContentTypes = @[UTTypeCreatePreferredIdentifierForTag(kUTTagClassIdentifier, @"com.yourcompany.ach", nil).takeRetainedValue(),
                                       UTTypeCreatePreferredIdentifierForTag(kUTTagClassIdentifier, @"com.yourcompany.customdoc", nil).takeRetainedValue()];
      [openfilepanel setAllowedContentTypes:allowedContentTypes];
      
    • 通过扩展名获取对应的UTI
      如果你习惯用扩展名来指定,也可以通过扩展名映射到UTI:

      NSArray *allowedContentTypes = @[UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, @"ach", nil).takeRetainedValue(),
                                       UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, @"cust", nil).takeRetainedValue()];
      [openfilepanel setAllowedContentTypes:allowedContentTypes];
      
  3. 额外提示

    • 确保调用setAllowedContentTypes时,数组里的UTI都是你司应用有权处理的(也就是Info.plist里注册过的),这样面板才会正确过滤。
    • macOS 12.2中allowedContentTypes是官方推荐的API,取代了旧的allowedFileTypes,建议坚持使用这个属性。

这样设置后,NSOpenPanel就只会显示属于你司应用的文件类型,其他类型会被隐藏或无法选中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:07:38