2010-07-27 14 views

Antwort

-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

Dieser Code erhält 'ThisAppName', aber tut nichts damit. – JWWalker

+0

Danke, entfernt. – beeci

+0

'getApplicationListForExtension:' ist nicht definiert. –

8

Hier ist ein Code-Snippet für eine sehr ähnliche Aufgabe: Stellen Sie sich als Standardanwendung für eine Erweiterungsdatei angegeben:

#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

Danke, aber schon gefunden die Antwort (siehe meine Antwort) - Ihre ist ein bisschen anders als meine, da es nur UTI für eine Erweiterung gefunden. Was ist, wenn es mehr gibt? – beeci

+1

Leider funktioniert dies nicht mehr für Sandbox-Anwendungen. – user362515

1

Hier ist eine leicht modifizierte und ARC-kompatible Version von Guillaume-Lösung :

#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

Ist das immer noch der beste Weg? Ich arbeite an einer Mac-App in Swift und ich übersetze das Swift wenn es so ist. –