如果想要在macOS上将App注册为“文件的可打开应用”,需要Info.plist和一个系统回调方法处理。
下面以“轻压图片”App为例,右击打开macOS上的图片时,显示“轻压图片”App选项。
配置Info.plist
在项目中,找到Info.plist文件,创建 “Document Types”条目。

在Xcode 16中默认只显示” Document Type Name”和“Handler rank”。
“Document Type Name”为命名,描述性文本,“Handler rank”默认为Default。
需要手动添加一个“LSItemContentTypes”数组,“LSItemContentTypes”默认会被转义为“Document Content Type Identifiers”。

添加打开文件的格式,例如这里配置常见图片格式的UTI类型:
public.image (所有图片格式的通用类型)
public.jpeg (JPEG 图片)
public.png (PNG 图片)
public.heic (HEIC 图片)
com.compuserve.gif (GIF 图片)
public.tiff (TIFF 图片)
com.microsoft.bmp (BMP 图片)
public.webp (WebP 图片)
配置后,运行应用。
Mac就会自动识别,并在Finder中右击打开图片时,可以选择自己的App(“轻压图片”)。

接收文件代码
在macOS中,需要调用系统回调接收文件的代码。
根据项目类型,主要分为两种:
1、使用AppDelegate接收
func application(_ application: NSApplication, open urls: [URL]) {
for url in urls {
print("接收到文件:", url.path)
handleImageFile(url)
}
}
处理函数:
func handleImageFile(_ url: URL) {
// 加入队列
// 加载图片
// 执行压缩
}
2、使用 SwiftUI 接收
.onOpenURL { url in
print("接收到文件:", url)
}
例如:
@main
struct ImageSlimApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
handleImageFile(url)
}
}
}
}
总结
从Finder中右键可以选择多个文件,通过AppDelegate 方式可以一次传入 [URL] 参数,SwiftUI 方法会多次调用 onOpenURL 方法。
如果编译并运行App后,仍然无法通过右键选择图片。可以执行一次系统注册刷新:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
然后重新打开Finder。
