快速查找名称中包含特定短语的应用的完整路径

时间:2013-12-19 19:30:34

标签: macos cocoa file-management

我正在开发一个小应用程序,它充当第三方应用程序的插件。要使其正常运行,我需要从第三方应用程序(此处的“其他应用程序”)访问已保存的文件。在较新的版本中,另一个应用程序将其保存在〜/ Application Support / Test App / Saved Files /中。

这很容易,使用类似的东西:

NSString *savedFiles = [NSHomeDirectory() stringByAppendingPathComponent:@"~/Application Support/Test App/Saved Files"];

但我也希望它与旧版本兼容,并且它们不使用应用程序支持文件夹。旧版本进入用户应用程序文件夹中的文件夹,例如此结构: 〜/ Applications / Test App / Test App.app 〜/ Applications / Test App / Saved Files /

我可以使用与上面相同的内容来查找保存文件的位置。但是应用程序并不总是安装在这里,或者文件夹名称可能在不同的语言中有所不同。这就是问题所在。

我想到目前为止,我认为以下是获取路径的选项:

  1. 要求用户使用文件选择器导航到该文件 在我的应用程序内
  2. 询问用户“Test App.app”的位置,然后获取 路径通过“../Saved Files /”相对于那个。
  3. 应用可以通过系统获取以前运行的应用程序的路径吗?
  4. 应用程序可以使用聚光灯快速找到位置吗?
  5. 还有其他方法可以自动,可靠,快速地完成此操作吗?
  6. 1和2不是首选,因为这将要求用户“工作”以给应用程序提供路径。你们都觉得怎么样? 还有其他方法可以实现自动化吗? 哪个会最快?

1 个答案:

答案 0 :(得分:2)

您可以尝试向LaunchServices询问应用程序的位置,并给出其LSFindApplicationForInfo调用的包标识符:

CFURLRef urlRef = NULL;
LSFindApplicationForInfo(kLSUnknownCreator, (CFStringRef)@"com.example.some-app", NULL, NULL, &urlRef);
NSLog(@"URL: %@", (__bridge id)urlRef);

这假设您提到的两个变体之间的包标识符相同。如果它只是名称相同,您可以通过名称查询:

CFURLRef urlRef = NULL;
LSFindApplicationForInfo(kLSUnknownCreator, NULL, (CFStringRef)@"Test App.app", NULL, &urlRef);
NSLog(@"URL: %@", (__bridge id)urlRef);