你能告诉我吗 - 我可以使用哪个对象和哪种方法来获取有关在 OSX 上使用 Objective c 或 macruby 安装的应用程序的信息?
7 回答
您可以只调用 Apple 命令行工具system_profiler
,例如
% system_profiler SPApplicationsDataType
对于 C 或 Objective-C,您可以使用它system()
来执行此操作。
欲了解更多信息:
% man system
% man system_profiler
如果您打算列出所有 GUI 应用程序,您可以使用Launch Services。有关函数列表,请参阅参考资料。
不要手动列出 .app
捆绑包!系统已经完成了,你只需要查询即可。有一个命令行程序lsregister
称为
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister
可用于获取 Launch Service 数据库的详细转储。这个工具有时很有帮助,但不要依赖于运输程序,
OS X 并没有真正的“安装应用程序”的概念。OS X 应用程序是独立的包,在 Finder 中显示为单个虚拟文件。没有中央注册表,只是将应用程序放置在 /Applications 或 ~/Applications 中以供每个用户“安装”的约定。
您能做的最好的事情就是枚举这些目录的内容,并且您找到的每个“.app”目录都是一个应用程序。它不会是详尽无遗的(如果我刚刚下载它们,我经常从我的桌面运行小应用程序)。
我按以下方式移动:
system_profiler SPApplicationsDataType -xml
从代码执行命令。密钥SPApplicationsDataType
意味着只需要应用程序数据。-xml
意味着我希望看到 xml 结果以便于解析。解析结果数组
在这里你可以找到关于从代码执行命令的好例子:Execute a terminal command from a Cocoa app
总代码示例如下所示:
NSStirng * commangString = @"system_profiler SPApplicationsDataType -xml";
NSData * resultData = [CommandLineTool runCommand:commangString];
NSArray * appArray = [PlistManager objectFromData:resultData];
// parse array of NSDictionaries here ....
// method from PlistManager
+ (id) objectFromData: (NSData *) data {
NSString *errorString = nil;
NSPropertyListFormat format;
id object = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListMutableContainers format:&format errorDescription:&errorString];
if (!errorString) {
return object;
} else {
NSLog(@"Error while plist to object conversion: %@", errorString);
return nil;
}
}
// runCommand method was used from post I mentioned before
通过 NSMetadataQuery 使用 Spotlight。
您可以在命令行中查看使用 mdfind 获得的结果:
mdfind "kMDItemContentType == 'com.apple.application-bundle'"
像魅力一样工作,非常非常快。
[[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.google.Chrome"];
Google Chrome
如果已安装,这将返回应用程序的路径,nil
否则。
如果您不知道BundleID
,有两种方法可以找到它:
1).plist
通过右键单击应用程序图标并选择Show Package Contents
选项来打开应用程序的文件。
Chrome .plist 的默认路径是/Applications/Google\ Chrome.app/Contents/Info.plist
2)lsregister
与 一起使用grep
。
尝试在应用程序中输入以下内容Terminal
,您将在那里找到 BundleID:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | grep -i chrome
由于它是一个类似 unix 的操作系统,因此没有真正的方法可以告诉您安装了什么(当然,除非您可以控制其他应用程序——那么出于显而易见的原因,有很多方法可以做到这一点)。
通常应用程序被放入 /Applications 或 ~/Applications 但你可以从任何地方运行它而不是那些文件夹(就像一个 unix 机器)