Ho l'elenco delle applicazioni per l'estensione di file fornita (utilizzando LSCopyApplicationURLsForURL). Voglio cambiare l'associazione file predefinita dal codice selezionando una delle applicazioni dalla chiamata precedente. C'è un modo per farlo?Impostazione dell'applicazione predefinita per l'estensione di file specificata su Mac OS X dal codice
risposta
- (void) setApplication:(NSString *)applicationName forExtension:(NSString *)extension {
NSArray *appPaths = [self getApplicationListForExtension:extension];
for (NSString *appPath in appPaths) {
if ([appPath rangeOfString:applicationName].location != NSNotFound) {
NSArray *UTIs = (NSArray *)UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension,
(CFStringRef)extension,
nil);
for (NSString *UTI in UTIs) {
LSSetDefaultRoleHandlerForContentType((CFStringRef)UTI,
kLSRolesEditor,
(CFStringRef)[[NSBundle bundleWithPath:appPath] bundleIdentifier]);
}
[UTIs release];
break;
}
}
}
Ecco un frammento di codice per un compito molto correlato: te impostato come applicazione predefinita per un determinato file con estensione:
#import <ApplicationServices/ApplicationServices.h>
#import "LaunchServicesWrapper.h"
@implementation LaunchServicesWrapper
+ (NSString *) UTIforFileExtension:(NSString *) extension {
NSString * UTIString = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
(CFStringRef)extension,
NULL);
return [UTIString autorelease];
}
+ (BOOL) setMyselfAsDefaultApplicationForFileExtension:(NSString *) fileExtension {
OSStatus returnStatus = LSSetDefaultRoleHandlerForContentType (
(CFStringRef) [LaunchServicesWrapper UTIforFileExtension:fileExtension],
kLSRolesAll,
(CFStringRef) [[NSBundle mainBundle] bundleIdentifier]
);
if (returnStatus != 0) {
NSLog(@"Got an error when setting default application - %d", returnStatus);
// Please see the documentation or LSInfo.h
return NO;
}
return YES;
}
@end
Grazie, ma ho già trovato la risposta (vedi la mia risposta) - la tua è un po 'diversa dalla mia, dal momento che ha trovato solo UTI per un'estensione. E se ce ne fossero di più? – beeci
Purtroppo, questo non funziona più per le applicazioni in modalità sandbox. – user362515
Ecco una versione leggermente modificata e ARC-compliant della soluzione di Guillaume :
#import <Foundation/Foundation.h>
@interface LaunchServicesWrapper : NSObject
+ (BOOL)setMyselfAsDefaultApplicationForFileExtension:
(NSString *)fileExtension;
@end
#import <ApplicationServices/ApplicationServices.h>
#import "LaunchServicesWrapper.h"
@implementation LaunchServicesWrapper
+ (NSString *)UTIforFileExtension:(NSString *)extension
{
return (NSString *)CFBridgingRelease(
UTTypeCreatePreferredIdentifierForTag(
kUTTagClassFilenameExtension, (__bridge CFStringRef)extension,
NULL
)
);
}
+ (BOOL)setMyselfAsDefaultApplicationForFileExtension:
(NSString *)fileExtension
{
return LSSetDefaultRoleHandlerForContentType(
(__bridge CFStringRef) [LaunchServicesWrapper
UTIforFileExtension:fileExtension], kLSRolesAll,
(__bridge CFStringRef) [[NSBundle mainBundle]
bundleIdentifier]
);
}
@end
È ancora il modo migliore per fare questo? Sto lavorando a un'app per Mac in Swift e lo tradurrò in Swift in caso affermativo. –
- 1. JNotify su Mac OS X?
- 2. Eseguito a livello di codice all'avvio su Mac OS X?
- 3. Come impostare l'applicazione predefinita per tipi di file specifici in Mac OS X?
- 4. Java FileChannel.tryLock funziona su Mac OS X?
- 5. Come ottenere il tipo di file su Mac OS X?
- 6. Abilitazione di Xdebug su Mac OS X Lion
- 7. Impostazione SDL su OS X 10.8
- 8. Divisione di un file tramite AWK su Mac OS X
- 9. SetWindowsHookEx per Mac OS X?
- 10. ldconfig per Mac OS X
- 11. FreeGLUT su Mac OS X Lion
- 12. Disinstallare MongoDB su Mac OS X
- 13. Installazione OpenCV su Mac OS X
- 14. Errore Apache su Mac OS X Lion
- 15. Problema con Virtualenv su Mac OS X
- 16. Autorizzazioni XAMPP su Mac OS X?
- 17. Collegamento statico wxHaskell su Mac OS X
- 18. Documentazione JDK in IntelliJ IDEA su Mac OS X
- 19. Come installo wxPython su Mac OS X?
- 20. Impossibile installare matplotlib su Mac OS X
- 21. Dove è il mio file .emacs su Mac OS X
- 22. Come configurare libusb su Mac OS X?
- 23. Installare CLSQL su Mac OS X
- 24. Indirizzo MAC dall'interfaccia su OS X (C)
- 25. Come installare mod_jk su Mac OS X
- 26. Installare libpq-dev su Mac OS X
- 27. Ottieni localhost su mac OS X Yosemite
- 28. Imparare ASP.NET MVC su Mac OS X
- 29. Nessun dispositivo Java su Mac OS X
- 30. Architettura dell'applicazione Cocoa su Mac OS X
Questo codice ottiene 'thisAppName' ma non fa nulla con esso. – JWWalker
Grazie, rimosso. – beeci
'getApplicationListForExtension:' non è definito. –