在我的代码中如何启动负责UTI的应用程序

时间:2009-08-01 18:08:57

标签: objective-c macos

我的Mac OS X应用程序通过网络接收文件(在本例中为text / x-vcard)。在我的代码中,如何在没有硬编码路径或应用程序名称的情况下打开相关应用程序(通常是地址簿),以便它处理文件?

2 个答案:

答案 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
);