Tôi có danh sách các ứng dụng cho phần mở rộng tệp đã cho (sử dụng LSCopyApplicationURLsForURL). Tôi muốn thay đổi liên kết tệp mặc định từ mã khi chọn một trong các ứng dụng từ cuộc gọi ở trên. Có cách nào để thực hiện việc này không?Đặt ứng dụng mặc định cho phần mở rộng tệp đã cho trên Mac OS X từ mã
Trả lời
- (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;
}
}
}
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
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
Đá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
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
Đâ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ó. –
- 1. Cách đặt ứng dụng mặc định cho các loại tệp cụ thể trong Mac OS X?
- 2. Trên MAC OS X 10.8.x làm thế nào để ứng dụng AppStore cài đặt phần mở rộng hạt nhân?
- 3. Mở rộng Mercurial OS X cho phép
- 4. Tích hợp Deltawalker cho Mac OS X và phần mở rộng exuriff của Mercurial
- 5. Nhúng JRE vào ứng dụng Swing cho Mac OS X
- 6. Ứng dụng .NET cho ứng dụng Mac OS X?
- 7. Phần mềm theo dõi lỗi cho Mac OS X
- 8. Cài đặt CLSQL trên Mac OS X
- 9. Phát triển cho Mac OS X, trên Windows?
- 10. ldconfig cho Mac OS X
- 11. Kiến trúc ứng dụng ca cao trên Mac OS X
- 12. Đặt biểu tượng của ứng dụng không phải là mac os x bundle
- 13. Làm cách nào để đặt biểu tượng cho gói ứng dụng Mac OS X của ứng dụng của tôi?
- 14. Pascal IDE dành cho Mac OS X
- 15. Đặt GCC 4.2 làm trình biên dịch mặc định trên Mac OS X Leopard
- 16. Lớp UIDevice dành cho Mac OS X?
- 17. Đặt TextMate làm trình soạn thảo văn bản mặc định trên Mac OS X
- 18. Nơi lưu trữ mã và cài đặt ứng dụng trên Mac OS X - chuyển đổi từ Windows
- 19. Android: Mở tệp đã lưu trong ứng dụng mặc định từ ứng dụng của tôi
- 20. Tại sao ứng dụng PyQt của tôi mở trong nền trên Mac OS X?
- 21. Định cấu hình Mercurial - FileMerge cho Apple Mac OS X
- 22. JNotify trên Mac OS X?
- 23. Quyền XAMPP trên Mac OS X?
- 24. Cài đặt Pygame cho Mac OS X 10.6.8
- 25. Mã nguồn cho Mac OS X Cập nhật Java
- 26. Phương án CADisplayLink cho Mac OS X
- 27. Nhà JRE nào được đặt trong Eclipse cho JDK7u4 trên Mac OS X?
- 28. Cách nhận loại tệp trên Mac OS X?
- 29. Gỡ cài đặt ipython mac os x
- 30. Mac OS X xác định rằng một ứng dụng cần Java như thế nào?
Mã này nhận 'thisAppName' nhưng không làm bất cứ điều gì với nó. – JWWalker
Cảm ơn, đã xóa. – beeci
'getApplicationListForExtension:' không được xác định. –