В моем коде, как запустить приложение, ответственное за UTI - PullRequest
1 голос
/ 01 августа 2009

Приложение Mac OS X получает файл по сети (в данном случае, text / x-vcard). В моем коде, как я могу открыть соответствующее приложение (обычно адресную книгу) без жестких кодов или имени приложения, чтобы оно обрабатывало файл?

Ответы [ 2 ]

2 голосов
/ 01 августа 2009

Вы сможете сделать это, связавшись с платформой ApplicationServices, которая имеет очень удобную функцию "LSCopyApplicationForMIMEType". Это работает так:

CFURLRef appURL = nil;
OSStatus err = LSCopyApplicationForMIMEType(CFSTR("text/x-vcard"), kLSRolesAll, &appURL);

if (err != kLSApplicationNotFoundErr) {
  NSLog(@"URL: %@", (NSURL *)appURL);
}

CFRelease(appURL);

Я объясню, что означают параметры. Первый параметр - это CFStringRef типа MIME, который вы ищете. Второй параметр указывает, какое приложение вы ищете, т.е. приложение, которое может редактировать этот файл, или приложение, которое может просматривать этот файл и т. Д. KLSRolesAll означает, что вам все равно. Последний параметр - это указатель на CFURLRef, где функция прикрепит URL-адрес приложения (если он может его найти).

На моей машине это печатает:

2009-08-01 12:38:58.159 EmptyFoundation[33121:a0f] URL: file://localhost/Applications/Address%20Book.app/

Одна из замечательных особенностей CFURLRef - это то, что они бесплатно соединяются с NSURL. Это означает, что вы можете взять CFURLRef и привести его к NSURL, и наоборот. Как только вы получили NSURL приложения, довольно просто использовать что-то вроде NSWorkspace -launchApplicationAtURL: options: configuration: error: метод для открытия приложения.

Если вы хотите открыть определенный файл в этом приложении (например, файл, из которого вы получили тип MIME), вы можете использовать что-то вроде - [NSWorkspace openFile: withApplication:].

Если вы не можете получить MIME-тип (несмотря на то, что вы говорите в своем вопросе), существует множество похожих функций LaunchServices. Вы можете прочитать все о них здесь .

0 голосов
/ 21 января 2010

Вместо того, чтобы пытаться найти приложение, вы можете использовать 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...