我试图在功能类似于"打开方式..."的应用程序中添加功能。 Finder中的菜单。在我正在处理的应用程序中,用户可以选择一个文件并选择使用特定应用程序打开它,而不是使用默认应用程序。
我遇到的问题是,我认为我应该使用的API似乎存在不匹配,以使其正常工作。具体而言,用于打开具有特定应用程序的文件的推荐NSWorkspace
API采用包标识符来指定应用程序:
[NSWorkspace openURLs:
withAppBundleIdentifier:
options:
additionalEventParamDescriptor:
launchIdentifiers:]
但是,用于获取可以打开给定文件的应用程序列表的Launch Services API会返回一个URL数组,每个URL都指向一个兼容的应用程序:
CFArrayRef LSCopyApplicationURLsForURL(CFURLRef inURL, LSRolesMask inRoleMask);
目前,我正在迭代启动服务返回的数组,并通过每次创建一个新的NSBundle来提取包标识符:
for (NSURL *applicationURL in applicationURLs) {
NSBundle *applicationBundle = [NSBundle bundleWithURL:applicationURL];
NSString *bundleIdentifier = applicationBundle.bundleIdentifier;
// Do something with bundle identifier...
}
我遇到的问题是,如果applicationURL
指向不在/Applications
下的应用程序(或我的沙盒应用程序具有读取权限的任何其他目录),那么我不能创建NSBundle
以读取包标识符。相反,Gate Keeper会向Console.app输出沙箱违规,NSBundle bundleWithURL
将返回nil。
我是否忽略了从我忽略的网址中获取捆绑包标识符的方法?或者是否有不同的方法从任意文件中读取包标识符而不会导致沙箱违规?或者可能有不同的方法来获取可以打开特定URL的所有应用程序的列表?
(请注意,不推荐使用用于打开多个URL的Launch Services方法LSOpenURLsWithRole
。头文件只是说"使用NSWorkspace"。)