Setting default application for given file extension on Mac OS X from code

前端 未结 3 1646
旧巷少年郎
旧巷少年郎 2020-12-14 04:59

I have the list of the applications for given file extension (using LSCopyApplicationURLsForURL). I want to change the default file association from code upon selecting one

相关标签:
3条回答
  • 2020-12-14 05:24

    Here’s a slightly modified and ARC-compliant version of Guillaume’s solution:

    #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 讨论(0)
  • 2020-12-14 05:31

    Here is a snippet of code for a very related task: set yourself as the default application for a given file extension:

    #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 讨论(0)
  • 2020-12-14 05:46
    - (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 讨论(0)
提交回复
热议问题