2009-08-01 8 views

Répondre

2

Vous pourrez faire cela en liant dans l'infrastructure ApplicationServices, qui a une fonction très pratique "LSCopyApplicationForMIMEType". Cela fonctionne comme ceci:

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

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

CFRelease(appURL); 

Je vais expliquer ce que signifient les paramètres. Le premier paramètre est un CFStringRef du type MIME que vous recherchez. Le deuxième paramètre indique le type d'application que vous recherchez, c'est-à-dire une application qui peut modifier ce fichier, ou une application qui peut afficher ce fichier, etc. kLSRolesAll signifie que vous ne vous en souciez pas. Le dernier paramètre est un pointeur vers CFURLRef où la fonction va coller l'URL de l'application (si elle peut en trouver un).

Sur ma machine, ceci affiche sur:

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

L'une des choses cool sur CFURLRefs est qu'ils sont pontés NSURL sans frais. Cela signifie que vous pouvez prendre un CFURLRef et le convertir en un NSURL, et vice versa. Une fois que vous avez votre NSURL de l'application, il est assez trivial d'utiliser quelque chose comme NSWorkspace -launchApplicationAtURL: options: configuration: error: méthode pour ouvrir l'application.

Si vous souhaitez ouvrir un fichier spécifique dans cette application (comme le fichier dont vous avez obtenu le type MIME), vous pouvez utiliser quelque chose comme - [NSWorkspace openFile: withApplication:].

Si vous ne pouvez pas obtenir le type MIME (malgré ce que vous dites dans votre question), il existe un tas de fonctions LaunchServices similaires. You can read all about them here.

+0

Merci! C'est exactement ce dont j'ai besoin. –

0

Plutôt que de prendre la peine d'essayer de trouver l'application, vous pouvez utiliser 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 
); 
Questions connexes