2010-07-27 36 views

Trả lời

-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

Mã này nhận 'thisAppName' nhưng không làm bất cứ điều gì với nó. – JWWalker

+0

Cảm ơn, đã xóa. – beeci

+0

'getApplicationListForExtension:' không được xác định. –

8

Dưới đây là một đoạn mã cho một nhiệm vụ rất quan: thiết lập cho mình như các ứng dụng mặc định cho một phần mở rộng tập tin đưa ra:

#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

Cảm ơn, nhưng đã tìm thấy câu trả lời (xem câu trả lời của tôi) - của bạn khác một chút so với tôi, vì nó chỉ tìm thấy UTI cho phần mở rộng. Nếu có nhiều thì sao? – beeci

+1

Đáng buồn thay, điều này không còn hoạt động cho các ứng dụng được bao cát. – user362515

1

Dưới đây là một phiên bản sửa đổi một chút và ARC tuân thủ trong giải pháp 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

Đây có phải là cách tốt nhất để giải quyết vấn đề này không? Tôi đang làm việc trên một ứng dụng mac trong Swift và tôi sẽ dịch sang Swift nếu có. –

Các vấn đề liên quan