如何针对我的应用文档类型关闭 Finder 的图标预览?

问题描述 投票:0回答:2

我已经成功地完成了正确的舞蹈,并为我的 OS X 应用程序的文档类型设置了自定义 UTI,并具有自定义文件扩展名等。 我还为我的文件类型设置了一个图标,这也有效。 我知道这一点是因为当我从应用程序保存新文件时,我可以看到它以正确的图标出现在 Finder 中。 但是 – 大约一秒钟后,Finder 将我的图标替换为一个通用的“预览”图标,在图标内显示我的文件的文本内容,并在预览图标的底部显示我的文件扩展名,大写,如下所示:

enter image description here

我认为发生这种情况是因为我声明我的自定义 UTI 具有 MIME 类型

text/plain
并符合
public.utf8-plain-text
。 我确实想这样做,因为它们实际上是文本文件,并且我希望允许用户这样对待它们,其他应用程序也这样识别它们,等等。但考虑到这一点,Finder(可能通过一些 QuickLook 生成器)或其他)因此说“啊哈,这是一个文本文件,我知道如何为文本文件制作自定义预览图标!”并替换我的自定义图标。 不用说,这不是我想要的。 我怎样才能防止这种情况发生? 我在我的项目中使用 Objective-C,但我不认为这是一个特定于语言的问题;这一切都与我的应用程序 plist 中的 UTI 声明有关。

说到这里,这是我的 UTI 在 Xcode 中配置方式的屏幕截图:

enter image description here

这是 Xcode 中 UTI 导出的屏幕截图:

enter image description here

那里的图标预览显示为问号是可以的;这是因为图标图像作为

.iconset
文件夹包含在我的项目中,该文件夹在构建时由 Xcode 转换为必需的
.icns
文件,而 Xcode 不够智能,无法显示正确的预览。 但正如我上面所说,正确的图标确实会在 Finder 中显示一秒钟,然后被预览图标替换,因此图标
.icns
文件的设置以及
.icns
与 UTI 的绑定是清楚的在职的。 同样,如果我在 Finder 中对文件执行“获取信息”,顺便说一句,它会在信息窗口的左上角显示正确的图标。 正确的图标也显示在我的应用程序窗口的标题栏中。 只是在 Finder 的显示中使用了错误的图标。 有什么想法吗?

xcode macos icons finder uti
2个回答
0
投票

经过进一步的实验,迄今为止我能找到的最佳解决方案是将“符合”字段从

public.utf8-plain-text
更改为简单的
public.text
public.text
UTI 适用于任何类型的文本 - 任何编码,带或不带标记等。任何更具体的符合 UTI 似乎都会导致 Finder(或无论它是谁)替换我的图标。 但使用
public.text
时,图标不会被替换,大概是因为无论是谁这样做,都感觉他们没有足够的信息来继续,因为
public.text
太通用了。

这确实不是最佳选择,因为这意味着我的文件使用的编码未在我的 UTI 导出信息中公开说明,从而导致其他应用程序不太可能以文本形式打开我的应用程序文件。 如果其他人有更好的解决方案,我很乐意投票给它而不是这个答案。 但对于后代,我已经提出了这个答案,因为它可能会帮助其他有类似情况的人。


0
投票

正如其他人提到的,现代 macOS 版本也会生成

public.text
的缩略图,因此 @bhaller 的解决方案不再有效。

从 macOS 15 开始,似乎只有两个选项:

  1. 对用户怀有敌意的人:不要声明符合

    public.text
    。这很糟糕,因为该文件不再可以在 TextEdit 等中轻松打开,但它可以工作。

  2. 丑陋的黑客:为应用程序实现缩略图扩展,并使用

    QLThumbnailProvider
    实现,其全部目的将是无法创建缩略图


@interface ThumbnailProvider : QLThumbnailProvider
@end

@implementation ThumbnailProvider

- (void)provideThumbnailForFileRequest:(QLFileThumbnailRequest *)request
                     completionHandler:(void (^)(QLThumbnailReply * _Nullable, NSError * _Nullable))handler
{
    handler([QLThumbnailReply replyWithContextSize:request.maximumSize
                        currentContextDrawingBlock:^BOOL {
        // return YES if the thumbnail was successfully drawn inside this block
        return NO;
    }], nil);
}

@end

Finder 将知道使用此 appex 来创建缩略图,并且即使缩略图创建失败也不会回退到默认实现。

© www.soinside.com 2019 - 2024. All rights reserved.