我已经成功地完成了正确的舞蹈,并为我的 OS X 应用程序的文档类型设置了自定义 UTI,并具有自定义文件扩展名等。 我还为我的文件类型设置了一个图标,这也有效。 我知道这一点是因为当我从应用程序保存新文件时,我可以看到它以正确的图标出现在 Finder 中。 但是 – 大约一秒钟后,Finder 将我的图标替换为一个通用的“预览”图标,在图标内显示我的文件的文本内容,并在预览图标的底部显示我的文件扩展名,大写,如下所示:
我认为发生这种情况是因为我声明我的自定义 UTI 具有 MIME 类型
text/plain
并符合 public.utf8-plain-text
。 我确实想这样做,因为它们实际上是文本文件,并且我希望允许用户这样对待它们,其他应用程序也这样识别它们,等等。但考虑到这一点,Finder(可能通过一些 QuickLook 生成器)或其他)因此说“啊哈,这是一个文本文件,我知道如何为文本文件制作自定义预览图标!”并替换我的自定义图标。 不用说,这不是我想要的。 我怎样才能防止这种情况发生? 我在我的项目中使用 Objective-C,但我不认为这是一个特定于语言的问题;这一切都与我的应用程序 plist 中的 UTI 声明有关。
说到这里,这是我的 UTI 在 Xcode 中配置方式的屏幕截图:
这是 Xcode 中 UTI 导出的屏幕截图:
那里的图标预览显示为问号是可以的;这是因为图标图像作为
.iconset
文件夹包含在我的项目中,该文件夹在构建时由 Xcode 转换为必需的 .icns
文件,而 Xcode 不够智能,无法显示正确的预览。 但正如我上面所说,正确的图标确实会在 Finder 中显示一秒钟,然后被预览图标替换,因此图标 .icns
文件的设置以及 .icns
与 UTI 的绑定是清楚的在职的。 同样,如果我在 Finder 中对文件执行“获取信息”,顺便说一句,它会在信息窗口的左上角显示正确的图标。 正确的图标也显示在我的应用程序窗口的标题栏中。 只是在 Finder 的显示中使用了错误的图标。 有什么想法吗?
经过进一步的实验,迄今为止我能找到的最佳解决方案是将“符合”字段从
public.utf8-plain-text
更改为简单的public.text
。 public.text
UTI 适用于任何类型的文本 - 任何编码,带或不带标记等。任何更具体的符合 UTI 似乎都会导致 Finder(或无论它是谁)替换我的图标。 但使用 public.text
时,图标不会被替换,大概是因为无论是谁这样做,都感觉他们没有足够的信息来继续,因为 public.text
太通用了。
这确实不是最佳选择,因为这意味着我的文件使用的编码未在我的 UTI 导出信息中公开说明,从而导致其他应用程序不太可能以文本形式打开我的应用程序文件。 如果其他人有更好的解决方案,我很乐意投票给它而不是这个答案。 但对于后代,我已经提出了这个答案,因为它可能会帮助其他有类似情况的人。
正如其他人提到的,现代 macOS 版本也会生成
public.text
的缩略图,因此 @bhaller 的解决方案不再有效。
从 macOS 15 开始,似乎只有两个选项:
对用户怀有敌意的人:不要声明符合
public.text
。这很糟糕,因为该文件不再可以在 TextEdit 等中轻松打开,但它可以工作。
丑陋的黑客:为应用程序实现缩略图扩展,并使用
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 来创建缩略图,并且即使缩略图创建失败也不会回退到默认实现。