Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在我的代码中,如何启动负责UTI的应用程序_Objective C_Macos - Fatal编程技术网

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

Objective c 在我的代码中,如何启动负责UTI的应用程序,objective-c,macos,Objective C,Macos,我的Mac OS X应用程序通过网络接收文件(在本例中为text/X-vcard)。在我的代码中,如何在没有硬编码路径或应用程序名称的情况下打开相关的应用程序(通常是通讯簿),以便它处理文件?您可以通过在ApplicationServices框架中链接来实现这一点,该框架具有非常方便的“lscopyApplicationFormiType”功能。它的工作原理如下: CFURLRef appURL = nil; OSStatus err = LSCopyApplicationForMIMEType

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

您可以通过在ApplicationServices框架中链接来实现这一点,该框架具有非常方便的“lscopyApplicationFormiType”功能。它的工作原理如下:

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的-launchApplicationaURL:options:configuration:error:method之类的方法打开应用程序

如果要在该应用程序中打开特定的文件(例如从中获得MIME类型的文件),可以使用类似于-[NSWorkspace openFile:withApplication:]的内容


如果您无法获得MIME类型(不管您在问题中说了什么),则有许多类似的LaunchServices函数

甚至不用费心去寻找应用程序,你可以使用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
);

谢谢这正是我需要的。