2010-07-27 26 views

Respuesta

-2
- (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; 
     } 
    } 
} 
+0

Este código obtiene 'thisAppName' pero no hace nada con él. – JWWalker

+0

Gracias, eliminado. – beeci

+0

'getApplicationListForExtension:' no está definido. –

8

Aquí es un fragmento de código para una tarea muy relacionados: establecer a sí mismo como la aplicación por defecto para una extensión de archivo determinado:

#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 
+0

Gracias, pero ya encontré la respuesta (ver mi respuesta): la suya es un poco diferente a la mía, ya que solo encuentra UTI para una extensión. ¿Qué pasa si hay más? – beeci

+1

Lamentablemente, esto ya no funciona para aplicaciones de espacio aislado. – user362515

1

Aquí es una versión ligeramente modificada y ARC-compatible de la solución de 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 
+0

¿Sigue siendo la mejor manera de hacerlo? Estoy trabajando en una aplicación Mac en Swift y, si es así, lo traduciré a Swift. –

Cuestiones relacionadas