2010-07-27 6 views

risposta

-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

Questo codice ottiene 'thisAppName' ma non fa nulla con esso. – JWWalker

+0

Grazie, rimosso. – beeci

+0

'getApplicationListForExtension:' non è definito. –

8

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

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

+1

Purtroppo, questo non funziona più per le applicazioni in modalità sandbox. – user362515

1

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

È ancora il modo migliore per fare questo? Sto lavorando a un'app per Mac in Swift e lo tradurrò in Swift in caso affermativo. –