您能告诉我 - 我可以使用哪个对象和哪种方法通过目标c或macruby获取OSX上已安装应用程序的信息?
答案 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机器一样)