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
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.
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
);
- 1. WPF-Methode zum Starten der Anwendung Nachrichtenschleife
- 2. Überprüfen NSURL für UTI/Dateityp
- 3. Exportierte UTI für Paket/Paket
- 4. DIAL-Protokoll zum Starten von Android-Anwendung
- 5. Exklusive iOS UTI
- 6. Starten der Anwendung im Querformat für IPad
- 7. Verwenden von Selfie Stick zum Starten der Anwendung
- 8. JavaFX starten eine andere Anwendung
- 9. Starten Sie eine Anwendung in Eclipse
- 10. Eine AggregateException in meinem eigenen Code werfen
- 11. Best Practice zum Starten einer Swing-Anwendung
- 12. Fehler beim Schließen der Anwendung zum Starten des Android-Dienstes
- 13. Scala-Anwendung in SBT für Integrationstest starten
- 14. Iphone, wie kann ich vermeiden, dass der Wachhund meine Anwendung für lange Zeit zum Starten tötet?
- 15. Starten der Anwendung Hauptklasse über jar
- 16. So starten Sie eine Android-Anwendung programmgesteuert
- 17. Debugger in C++ - Code starten
- 18. Starten Sie eine Java-Anwendung von einer anderen Java-Anwendung
- 19. Binden und Starten eines Dienstes beim Starten der Anwendung
- 20. Unerklärliche Fehler in meinem Code
- 21. Play Famework 2 - Scala - Starten Sie eine Anwendung für Testsuite
- 22. Starten Sie die Android-Anwendung ohne Hauptaktivität und starten Sie den Dienst beim Starten der Anwendung
- 23. CoreLocation - Geofence-Ereignis zum Starten der Standortdienste
- 24. Starten eine Windows-Anwendung von Windows-Dienst
- 25. erorr in meinem Code
- 26. Starten Sie SIRI aus der Anwendung
- 27. Eine bereits gestartete Anwendung neu starten
- 28. Wo ist der Fehler in meinem Code?
- 29. Android Intent zu starten Hauptaktivität der Anwendung
- 30. Wamp nicht erkennen, eine Änderung in meinem Code?
Danke! Genau das brauche ich. –