Ich habe die Liste der Anwendungen für bestimmte Dateierweiterung (mit LSCopyApplicationURLsForURL). Ich möchte die Standarddateizuordnung vom Code ändern, wenn ich eine der Anwendungen aus dem obigen Aufruf auswähle. Gibt es eine Möglichkeit, dies zu tun?Einstellen der Standardanwendung für bestimmte Dateierweiterung unter Mac OS X von Code
Antwort
- (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;
}
}
}
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
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
Leider funktioniert dies nicht mehr für Sandbox-Anwendungen. – user362515
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
Ist das immer noch der beste Weg? Ich arbeite an einer Mac-App in Swift und ich übersetze das Swift wenn es so ist. –
Dieser Code erhält 'ThisAppName', aber tut nichts damit. – JWWalker
Danke, entfernt. – beeci
'getApplicationListForExtension:' ist nicht definiert. –