2009-08-01 3 views
1

Meine Mac OS X-Anwendung erhält eine Datei über das Netzwerk (in diesem Fall text/x-vcard). Wie kann ich in meinem Code die zugehörige Anwendung (normalerweise das Adressbuch) öffnen, ohne Pfade oder Anwendungsnamen fest codieren zu müssen, damit die Datei verarbeitet wird?In meinem Code zum Starten der Anwendung für eine UTI

Antwort

2

Sie können dies tun, indem Sie im ApplicationServices-Framework verknüpfen, die eine wirklich praktische Funktion "LSCopyApplicationForMIMEType" hat. Es funktioniert wie folgt:

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

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

CFRelease(appURL); 

Ich werde erklären, was die Parameter bedeuten. Der erste Parameter ist ein CFStringRef des MIME-Typs, den Sie suchen. Der zweite Parameter gibt an, nach welcher Art von Anwendung Sie suchen, dh eine App, die diese Datei bearbeiten kann, oder eine App, die diese Datei anzeigen kann usw. kLSRolesAll bedeutet, dass es Ihnen egal ist. Der letzte Parameter ist ein Zeiger auf den CFURLRef, wo die Funktion die URL der App festhält (falls sie eine findet).

Auf meinem Rechner diese ausdruckt:

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

Eine der kühlen Sachen über CFURLRefs ist, dass sie gebührenfrei zu NSURL überbrückt. Dies bedeutet, dass Sie eine CFURLRef-Datei aufnehmen und sie in eine NSURL-Datei umwandeln können (und umgekehrt). Sobald Sie Ihre NSURL der App haben, ist es ziemlich trivial, etwas wie NSWorkspace -launchApplicationAtURL zu verwenden: options: configuration: error: method, um die Anwendung zu öffnen.

Wenn Sie eine bestimmte Datei in dieser Anwendung öffnen möchten (wie die Datei, von der Sie den MIME-Typ erhalten haben), könnten Sie etwas wie - [NSWorkspace openFile: withApplication:] verwenden.

Wenn Sie den MIME-Typ nicht bekommen (trotz was Sie in Ihrer Frage sagen), gibt es eine Reihe von ähnlichen LaunchServices-Funktionen. You can read all about them here.

+0

Danke! Genau das brauche ich. –

0

Anstatt sogar zu versuchen, die Anwendung zu finden, können Sie LSOpenItemsWithRole verwenden.

//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 
); 
Verwandte Themen