2011-03-01 3 views
9

मुझे याद है कि एक कोको फ्रेमवर्क या ऐप्पलस्क्रिप्ट शब्दकोश होने के कारण यह जांचने के लिए कि किसी विशिष्ट नाम के साथ एक एप्लिकेशन बंडल कंप्यूटर पर कहीं भी स्थापित है या नहीं।जांचें कि कोई मैक ओएस एक्स एप्लिकेशन मौजूद है

मैं यह कैसे कर सकता हूं? या तो कोको, ऐप्पलस्क्रिप्ट, या कमांड लाइन मेरे लिए उपयोगी हैं। विशेष रूप से समारोह LSFindApplicationForInfo()

> mdfind 'kMDItemContentType == "com.apple.application-bundle" && kMDItemFSName = "Google Chrome.app"' 

उत्तर

21

आप Launch Services का उपयोग करना चाहिए ऐसा करने के लिए,:

+1

रिलीज से पहले (appURL) को भूलना न भूलें, यदि यह नहीं मिला है तो यह एक अप्रत्याशित ऑब्जेक्ट को रिलीज़ करने का प्रयास करेगा, जिससे क्रैश – Daniel

+0

अच्छा बिंदु तय हो जाएगा। –

+0

नोट: LSFindApplicationForInfo 10.12 के रूप में बहिष्कृत लगता है। कोई भी एक विकल्प जानता है? – Tony

3
कमांड लाइन से

इस यह करने के लिए लगता है।

तुम इतनी तरह उपयोग:

#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); 
+3

ऐप ढूंढने के लिए स्पॉटलाइट एपीआई का उपयोग लॉन्च सेवाओं का उपयोग करने से बहुत धीमा होगा। –

1

तुम भी 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 

यह बहुत तेज है और आप इसे पाइथन जैसे अन्य भाषाओं से आसानी से कर सकते हैं। आप इसे सबसे कुशल बनाने के लिए जो कुछ भी कर रहे हैं उसके साथ खेलना चाहते हैं।

+0

आप सही हैं कि यह उन भाषाओं के लिए समाधान है जो देशी API का उपयोग नहीं कर सकते हैं। हालांकि, कोको ऐप से कमांड लाइन उपकरण कॉल करने के लिए यह अधिक होगा, क्योंकि यह केवल उसी लॉन्च सेवा API से पूछताछ करता है। –

+0

सच है लेकिन ओपी स्पष्ट नहीं था कि वह इसका उपयोग कैसे कर रहा था। इसके अलावा अन्य लोगों को निश्चित रूप से कुछ अन्य समान समस्या के लिए यह पृष्ठ मिल जाएगा। – Clark