Есть несколько механизмов, которые вы можете использовать для этого. Одним из них является использование диалога открытия файла, как предлагается в других ответах.
Еще один вариант, если вы знаете тип файла, для которого вы хотите найти подходящие приложения, - это использовать одну из следующих функций Launch Services:
LSCopyApplicationURLsForURL()
, который возвращает список приложений, которые могут открывать определенный URL
LSCopyAllHandlersForURLScheme()
, который возвращает список приложений, которые могут открывать определенную схему URL (например, http
)
LSCopyAllRoleHandlersForContentType()
, который возвращает список приложений, которые обрабатывают определенный тип контента
Кроме того, вы можете использовать Spotlight, чтобы найти все приложения в вашей системе и отобразить диалоговое окно, в котором вы можете выбрать из них.
Однако имейте в виду, что по умолчанию это вернет лот приложений, включая вспомогательные приложения (в моей системе это возвращает 1628 результатов), поэтому вам нужно быть осторожным при создании предиката поиска и ограничить поиск только папками «Приложения» и исключить файлы внутри пакетов и системных расположений.
Ниже приведен код, который найдет все приложения в системе. Вам нужно будет изменить предикат для собственного использования.
#import <Cocoa/Cocoa.h>
@interface Search : NSObject
{
NSMetaDataQuery* query;
}
@end
@implementation Search
-(id) init
{
self = [super init];
if(self)
{
query=[[NSMetadataQuery alloc] init];
[query setPredicate:[NSPredicate predicateWithFormat:@"kMDItemKind == \"Application\""]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedSearchForApplications:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
[query startQuery];
}
return self;
}
-(void) finishedSearchForApplications:(NSNotification*) notification
{
//get the number of items in the results
NSUInteger resultCount = [[query results] count];
NSMutableArray* appsFound = [NSMutableArray array];
//loop through the results and add their paths to an array
NSUInteger i;
for(i=0;i<resultCount;i++)
{
id queryResult=[query resultAtIndex:i];
NSString* pathOfItem = [[[[queryResult valueForKey:@"kMDItemPath"] stringByStandardizingPath] stringByAbbreviatingWithTildeInPath] stringByDeletingPathExtension];
NSDictionary* fileInfo = [NSDictionary dictionaryWithObject:pathOfItem forKey:@"path"];
[appsFound addObject:fileInfo];
}
NSLog(@"%ld apps found: %@",resultCount,appsFound);
//do something with appsFound
}
- (void)dealloc
{
[query release];
[super dealloc];
}
@end