我的Mac OS X应用程序通过网络接收文件(在本例中为text / x-vcard)。在我的代码中,如何在没有硬编码路径或应用程序名称的情况下打开相关应用程序(通常是地址簿),以便它处理文件?
答案 0 :(得分:2)
您可以通过在ApplicationServices框架中进行链接来实现这一点,该框架具有非常方便的“LSCopyApplicationForMIMEType”功能。它的工作原理如下:
CFURLRef appURL = nil;
OSStatus err = LSCopyApplicationForMIMEType(CFSTR("text/x-vcard"), kLSRolesAll, &appURL);
if (err != kLSApplicationNotFoundErr) {
NSLog(@"URL: %@", (NSURL *)appURL);
}
CFRelease(appURL);
我将解释参数的含义。第一个参数是您正在查找的MIME类型的CFStringRef。第二个参数表示您正在寻找的应用程序类型,即可以编辑此文件的应用程序,或者可以查看此文件的应用程序等.kLSRolesAll表示您不关心。最后一个参数是指向CFURLRef的指针,其中函数将粘贴应用程序的URL(如果它可以找到一个)。
在我的机器上打印出来:
2009-08-01 12:38:58.159 EmptyFoundation[33121:a0f] URL: file://localhost/Applications/Address%20Book.app/
关于CFURLRefs的一个很酷的事情是它们是免费的桥接NSURL。这意味着您可以使用CFURLRef并将其转换为NSURL,反之亦然。一旦你获得了应用程序的NSURL,使用类似NSWorkspace的-launchApplicationAtURL:options:configuration:error:方法来打开应用程序是非常简单的。
如果要在该应用程序中打开特定文件(如获取MIME类型的文件),可以使用类似 - [NSWorkspace openFile:withApplication:]。
如果你无法获得MIME类型(尽管你在问题中说了什么),那么有很多类似的LaunchServices函数。 You can read all about them here
答案 1 :(得分:0)
您可以使用LSOpenItemsWithRole,而不是费心去尝试查找应用程序。
//Opens items specified as an array of values of type FSRef with a specified role.
OSStatus LSOpenItemsWithRole (
const FSRef *inItems,
CFIndex inItemCount,
LSRolesMask inRole,
const AEKeyDesc *inAEParam,
const LSApplicationParameters *inAppParams,
ProcessSerialNumber *outPSNs,
CFIndex inMaxPSNCount
);