如何使用Objective C或Macruby发现OS X上安装的应用程序?

时间:2010-05-04 12:04:04

标签: objective-c macos macruby

您能告诉我 - 我可以使用哪个对象和哪种方法通过目标c或macruby获取OSX上已安装应用程序的信息?

7 个答案:

答案 0 :(得分:4)

如果您要列出所有GUI应用程序,可以使用Launch Services。有关功能列表,请参阅the reference

不要手动列出 .app 捆绑包!它已经由系统完成,您只需查询它即可。

有一个名为lsregister的命令行程序
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister

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

答案 1 :(得分:3)

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

% system_profiler SPApplicationsDataType

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

欲了解更多信息:

% man system

% man system_profiler

答案 2 :(得分:2)

OS X实际上没有“安装应用程序”的概念。 OS X应用程序是自包含的bundle,它们作为单个虚拟文件出现在Finder中。没有中央注册表,只是一个约定,应用程序放在/ Applications或〜/ Applications中,每个用户“安装”。

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

答案 3 :(得分:1)

我采取了以下方式:

  • 执行命令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

答案 4 :(得分:0)

通过NSMetadataQuery使用Spotlight。

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

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

像魅力一样,非常快。

答案 5 :(得分:0)

[[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.google.Chrome"];

如果已安装Google Chrome应用,则会返回nil应用的路径,否则为BundleID

如果您不知道.plist,可以通过两种方式找到它:

1)右键点击应用图标并选择Show Package Contents选项,打开应用的/Applications/Google\ Chrome.app/Contents/Info.plist文件。

Chrome .plist的默认路径为lsregister

2)与grep一起使用Terminal

尝试在/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | grep -i chrome 应用中输入以下内容,您会在那里找到BundleID:

  if let path = Bundle.main.path(forResource: "videoplayback", ofType: "mp4"){
        let video = AVPlayer(url: URL(fileURLWithPath:path))

        let videoPlayer = AVPlayerViewController()
        videoPlayer.player = video
        present(videoPlayer,animated: true,completion: {
            video.play()
        })
    }

答案 6 :(得分:-1)

因为它是一个类似unix的操作系统,所以没有真正的方法可以告诉你已经安装了什么(当然除非你控制了另一个应用程序 - 然后有很多方法可以解决这个问题)。< / p>

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