【问题标题】:Assigning UTI to file type将 UTI 分配给文件类型
【发布时间】:2010-07-28 14:26:24
【问题描述】:

我正在尝试为一对文件类型添加 UTI,按扩展名匹配。我想我已经正确设置了它 - 至少,文件扩展名 - > UTI 映射被识别(我在 info.plist 中将其声明为导入类型)。但是,当我尝试从我的测试文件中获取 UTI 时,我得到了一个动态 UTI。这是我用来测试这两种情况的示例代码:

NSString *previewTypeUTI = nil;
NSURL *previewFileURL = [NSURL fileURLWithPath:@"/Users/eblair/Desktop/EWF/thetestfile.myext1"];

[previewFileURL getResourceValue:&previewTypeUTI forKey:NSURLTypeIdentifierKey error:nil];
NSLog(@"%@", previewTypeUTI);    // #1
NSString *testUTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)[previewFileURL pathExtension], NULL);
NSLog(@"%@", testUTI);           // #2
[testUTI release];

NSLog #1 打印出“dyn.########”,NSLog #2 打印出“com.mycompany.filetype1”。我本来希望他们打印同样的东西。是否有一些额外的步骤可以使文件->UTI 映射正常工作,或者是启动服务需要赶上吗?

仅使用扩展名->UTI 映射不是一个选项,因为我想使用一些利用 UTI 的 API,而这些 API 似乎正在使用文件->UTI 映射。

为了完整起见,这里是导入类型的 plist 条目:

<key>UTImportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.disk-image</string>
        </array>
        <key>UTTypeDescription</key>
        <string>File Type 1</string>
        <key>UTTypeIdentifier</key>
        <string>com.mycompany.filetype1</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>myext1</string>
            </array>
        </dict>
    </dict>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.disk-image</string>
        </array>
        <key>UTTypeDescription</key>
        <string>File Type 2</string>
        <key>UTTypeIdentifier</key>
        <string>com.mycompany.filetype2</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>myext2</string>
            </array>
        </dict>
    </dict>
</array>

【问题讨论】:

    标签: objective-c macos file-type uti


    【解决方案1】:

    嗯,已经快一年了,但我今天不得不重新解决这个问题,我想我偶然发现了我做错了什么。看起来您需要将public.data 包含为您符合的类型,即使public.disk-image 已经符合public.data。所以,UTTypeConformsTo 数组应该是这样的:

        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
            <string>public.disk-image</string>
        </array>
    

    进行此更改后,我上面对文件->UTI 和扩展名->UTI 的比较现在产生了相同的结果。

    【讨论】:

    • 我知道这已经很老了,但是docs 说“在测试两个 UTI 是否相同时,您应该始终使用 UTTypeEqual 函数而不是直接比较字符串”。我认为这可能会解决问题,而无需在 plist 中插入重复的一致性。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2022-06-19
    • 2020-01-02
    相关资源
    最近更新 更多