5

你能告诉我吗 - 我可以使用哪个对象和哪种方法来获取有关在 OSX 上使用 Objective c 或 macruby 安装的应用程序的信息?

4

7 回答 7

4

您可以只调用 Apple 命令行工具system_profiler,例如

% system_profiler SPApplicationsDataType

对于 C 或 Objective-C,您可以使用它system()来执行此操作。

欲了解更多信息:

% man system

% man system_profiler

于 2010-05-04T12:10:08.073 回答
4

如果您打算列出所有 GUI 应用程序,您可以使用Launch Services。有关函数列表,请参阅参考资料

不要手动列出 .app 捆绑包!系统已经完成了,你只需要查询即可。有一个命令行程序lsregister称为

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister

可用于获取 Launch Service 数据库的详细转储。这个工具有时很有帮助,但不要依赖于运输程序,

于 2010-05-04T14:23:34.233 回答
3

OS X 并没有真正的“安装应用程序”的概念。OS X 应用程序是独立的包,在 Finder 中显示为单个虚拟文件。没有中央注册表,只是将应用程序放置在 /Applications 或 ~/Applications 中以供每个用户“安装”的约定。

您能做的最好的事情就是枚举这些目录的内容,并且您找到的每个“.app”目录都是一个应用程序。它不会是详尽无遗的(如果我刚刚下载它们,我经常从我的桌面运行小应用程序)。

于 2010-05-04T12:07:07.437 回答
2

我按以下方式移动:

  • 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
于 2013-12-04T11:11:19.840 回答
1

通过 NSMetadataQuery 使用 Spotlight。

您可以在命令行中查看使用 mdfind 获得的结果:

mdfind "kMDItemContentType == 'com.apple.application-bundle'"

像魅力一样工作,非常非常快。

于 2017-12-26T06:08:32.190 回答
0
[[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
于 2018-04-24T13:01:43.797 回答
-2

由于它是一个类似 unix 的操作系统,因此没有真正的方法可以告诉您安装了什么(当然,除非您可以控制其他应用程序——那么出于显而易见的原因,有很多方法可以做到这一点)。

通常应用程序被放入 /Applications 或 ~/Applications 但你可以从任何地方运行它而不是那些文件夹(就像一个 unix 机器)

于 2010-05-04T12:09:20.007 回答