Cocoa 检查是否存在Mac OS X应用程序

Cocoa 检查是否存在Mac OS X应用程序,cocoa,macos,applescript,Cocoa,Macos,Applescript,我记得有一个Cocoa框架或AppleScript字典,用于检查计算机上的任何位置是否安装了具有特定名称的应用程序包 我该怎么做?Cocoa、AppleScript或命令行对我很有用。从命令行看,这似乎可以做到: > mdfind 'kMDItemContentType == "com.apple.application-bundle" && kMDItemFSName = "Google Chrome.app"' 为此,您应该使用函数LSFindApplicationF

我记得有一个Cocoa框架或AppleScript字典,用于检查计算机上的任何位置是否安装了具有特定名称的应用程序包


我该怎么做?Cocoa、AppleScript或命令行对我很有用。

从命令行看,这似乎可以做到:

> mdfind 'kMDItemContentType == "com.apple.application-bundle" && kMDItemFSName = "Google Chrome.app"'
为此,您应该使用函数
LSFindApplicationForInfo()

你这样使用它:

#import <ApplicationServices/ApplicationServices.h>

CFURLRef appURL = NULL;
OSStatus result = LSFindApplicationForInfo (
                                   kLSUnknownCreator,         //creator codes are dead, so we don't care about it
                                   CFSTR("com.apple.Safari"), //you can use the bundle ID here
                                   NULL,                      //or the name of the app here (CFSTR("Safari.app"))
                                   NULL,                      //this is used if you want an FSRef rather than a CFURLRef
                                   &appURL
                                   );
switch(result)
{
    case noErr:
        NSLog(@"the app's URL is: %@",appURL);
        break;
    case kLSApplicationNotFoundErr:
        NSLog(@"app not found");
        break;
    default:
        NSLog(@"an error occurred: %d",result);
        break;          
}

//the CFURLRef returned from the function is retained as per the docs so we must release it
if(appURL)
    CFRelease(appURL);
#导入
CFURLRef-appURL=NULL;
OSStatus结果=lsFindApplication ForInfo(
kLSUnknownCreator,//创建者代码已经死了,所以我们不在乎它
CFSTR(“com.apple.Safari”),//您可以在此处使用bundle ID
NULL,//或此处应用程序的名称(CFSTR(“Safari.app”))
NULL,//如果希望使用FSRef而不是CFURLRef,则使用此选项
&appURL
);
开关(结果)
{
案件编号:
NSLog(@“应用程序的URL为:%@”,appURL);
打破
案例KLA申请未发现错误:
NSLog(@“未找到应用程序”);
打破
违约:
NSLog(@“发生错误:%d”,结果);
打破
}
//函数返回的CFURLRef将根据文档保留,因此我们必须释放它
if(appURL)
CFRelease(appURL);

您也可以使用
lsregister

on doesAppExist(appName)
    if (do shell script "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep com.apple.Safari") ¬
    contains "com.apple.Safari" then return true
end appExists

这相当快,而且您可以很容易地从其他语言(如Python)完成。您可能希望使用grep来提高效率。

使用Spotlight API查找应用程序比使用Launch Services要慢得多。您是对的,它是一种针对无法使用本机API的语言的解决方案。然而,从Cocoa应用程序调用命令行工具未免有些过火,因为它只是查询同一个Launch Services API。没错,但OP不清楚他是如何使用它的。另外,其他人肯定会发现此页面存在其他类似问题。请不要忘记,如果(appURL)在发布之前没有找到,它将尝试发布一个不存在的对象,并生成一个crashNote:LSFindApplicationForInfo从10.12起似乎已弃用。有人知道另一种选择吗?