2012-01-12 19 views
6

क्या किसी को दिए गए बंडल पहचानकर्ता के साथ हर ऐप (फाइल सिस्टम में) खोजने के लिए एक अच्छा तरीका पता है? NSWorkspace और लॉन्च सेवाएं आपको बंडल पहचानकर्ता द्वारा ऐप की तलाश करने देती हैं, लेकिन केवल एक ही परिणाम लौटाती हैं। मुझे संदेह है कि स्पॉटलाइट (NSMetadataQuery) मदद कर सकता है, लेकिन मैं अपने एपीआई पर थोड़ा अस्पष्ट हूं, इसलिए मुझे यकीन नहीं है कि कोई उचित कुंजी है या नहीं।एक ही बंडल पहचानकर्ता के साथ एकाधिक ऐप्स कैसे खोजें?

कमांड लाइन lsregister उपकरण (लॉन्च सर्विसेज.फ्रेमवर्क के अंदर) है, जिसे सिस्टम पर सबकुछ पंजीकृत करने के लिए कहा जा सकता है और फिर उसे जो भी पता है, उस पर एक रिपोर्ट डंप कर सकते हैं। उस पर निर्भर आदर्श से कम लगता है, क्योंकि यह अनियंत्रित है और इसके आउटपुट को पार्स करना दर्द हो सकता है।

(पृष्ठभूमि: मैं गेम मोडिंग के लिए एक ऐप बना रहा हूं, और यूजर को ओपन पैनल में पूरी फाइल सिस्टम के माध्यम से खोदने की आवश्यकता के बजाय समर्थित गेम की एक छोटी सूची से चुनने के लिए यूआई प्रदान करना चाहता हूं। हालांकि, मुझे उम्मीद है कि उपयोगकर्ता के पास स्थापित गेम की कई प्रतियां होंगी: रिलीज और बीटा, मॉडलिंग के लिए अतिरिक्त प्रतियां, आदि)

+0

थोड़ा और अधिक कुशलता से, 'lsregister' को केवल * एक * चीज़ पंजीकृत करने के लिए कहा जा सकता है, और उसके बाद जो कुछ भी जानता है उस पर एक रिपोर्ट डंप करें। – JWWalker

+0

आपने लॉन्च सर्विसेज का उल्लेख किया है, लेकिन आपको में LSCopyApplicationURLsForBundleIdentifier() को देखने से चूक जाना चाहिए। "लॉन्च सर्विसेज आपको बंडल पहचानकर्ता द्वारा ऐप की तलाश करने देती है, लेकिन केवल एक ही परिणाम लौटाती है" - आप किस फ़ंक्शन का जिक्र कर रहे थे? मेरा उत्तर देखें: http://stackoverflow.com/a/37153167/754997 –

+0

@ChrisPage: वास्तव में, 10.7 समय सीमा में वापस मुझे यह याद करना होगा कि ऐप्पल केवल उस समारोह को पेश करेगा जो मुझे बाद में तीन ओएस एक्स संस्करणों की आवश्यकता है। – rickster

उत्तर

4

इस प्रश्न को ओएस एक्स शेर 10.7 से संबंधित 2012 में पूछा गया था। OS X Yosemite 10.10 के रूप में जवाब है:

LSCopyApplicationURLsForBundleIdentifier

सारांश:

एक बंडल पहचानकर्ता (जैसे com.apple.finder के रूप में), इसी आवेदन करने के लिए किए गए सभी URL लगता है यह देखते हुए।

चर्चा:

रिटर्न अनुप्रयोगों है, जिनमें निर्दिष्ट बंडल पहचानकर्ता को शून्य या उससे अधिक URL।

7

आप kMDItemCFBundleIdentifier स्पॉटलाइट/मेटाडेटा कुंजी चाहते हैं।

pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'" 
/Applications/VLC.app 
/Applications/vlc-0.8.6c/VLC.app 

वहां से यह बस (अपने जहर, कार्बन या कोको लेने) file metadata APIs करने के लिए सही कॉल करने की बात होनी चाहिए। दिलचस्प बात यह है कि, यह कुंजी बहुत अच्छी तरह से प्रलेखित नहीं है: यह File Metadata Attributes Reference में नहीं है, हालांकि यह MDItem Reference में है।

एक बार फिर, यह दिखाने के लिए कि खेल modding टूल्स बढ़ा क्षुधा के उपयोग के मामलों कुछ अन्य प्रकार बढ़ा सकते हैं और that sometimes aren't very well served by Apple ... </सोपबॉक्स >

परिशिष्ट जाता है: एक बार आप अपने सूची है, मेरी राय में सबसे अच्छा तरीका है इसे उपयोगकर्ता को पेश करने के लिए आपको मिली प्रत्येक आइटम के संस्करण (kMDItemVersion) को सूचीबद्ध करना होगा; आप पथ भी दिखा सकते हैं, लेकिन संस्करण उपयोगकर्ता के लिए सबसे उपयोगी चीज होने की संभावना है (आखिरकार, वह विशिष्ट संस्करणों के लिए अलग-अलग उदाहरण रखता है)।

+0

यह बहुत अच्छा काम करता है, धन्यवाद! मैं एक अजीब मुद्दा देख रहा हूं, हालांकि: जब मैं 'mdfind' का उपयोग करके "com.blizzard.WarcraftIII" खोजता हूं, तो यह ठीक काम करता है, लेकिन जब मैं 'NSMetadataQuery' का उपयोग करता हूं, तो परिणामों के पास' kmDItemDisplayName' 'के लिए एक मान होता है लेकिन कोई' kmDItemPath नहीं ' '(या उस मामले के लिए 'kmDItemVersion')। अन्य बंडल आईडी ठीक काम करते हैं (कम से कम मैंने कोशिश की है; मेरा ऐप बर्फ़ीला तूफ़ान के खेल के साथ काम करता है, और वाह और एससी 2 अन्य हैं जिन्हें मैंने परीक्षण के लिए आसान बनाया है)। मुझे संदेह है कि यह एक बग है ... – rickster

+0

@rickster आप सुनिश्चित हैं कि आप कम से कम पथ नहीं प्राप्त कर सकते हैं? (मेरे पास War3 है लेकिन मेरे पास इस मशीन पर एक्सकोड नहीं है, इसलिए मैं जांच नहीं कर सकता।) वास्तव में War3 में एक उपयोगी संस्करण प्रतीत नहीं होता है, और यहां तक ​​कि अगर यह एक बग है तो आपको कुछ करना है, इसलिए यदि आप पथ या यूआरएल प्राप्त कर सकते हैं (यह आइटम कहीं और हो गया है!), आप दिलचस्प जानकारी प्राप्त करने के लिए War3- विशिष्ट प्रसंस्करण लागू कर सकते हैं, उदाहरण के लिए Info.plist से उस गैर-मानक बर्फ़ीला तूफान की कुंजी प्राप्त करना। बीटीडब्ल्यू, आप प्रदर्शन नाम प्राप्त करने के लिए प्रतिबिंब रखने के लिए एक समर्थक हैं। –

+0

यूप, कोई रास्ता नहीं। स्पष्ट रूप से 'NSMetadataQuery' ने ऐप पाया और पथ है; अन्यथा यह मुझे नाम बताने में सक्षम नहीं होता ... लेकिन परिणाम में 'kmDItemPath' कुंजी (और कुछ अन्य भी) की कमी है। ऐसा लगता है कि ऐसा कोई भी प्रश्न है जो उस ऐप को ढूंढता है (यानी नाम से इसे खोजना पथ नहीं मिलेगा)। बहुत अजीब। मैं यह देखने के लिए कुछ कर रहा हूं कि क्या कोई अन्य ऐप बंडल है जो इस समस्या को प्रदर्शित करता है और संभवतः यहां एक और प्रश्न पूछ रहा है और/या एक बग दर्ज कर रहा है। – rickster

1

एक और विकल्प एक विशिष्ट यूआरएल योजना को संभालने वाले सभी अनुप्रयोगों की सभी प्रतियों को खोजने के लिए LSCopyApplicationURLsForURL का उपयोग करना है। हालांकि यूआरएल योजना को परिभाषित करने के लिए आवेदन की आवश्यकता होती है।

उदाहरण के लिए, आप 'मेलो' योजना को संभालने वाले सभी ईमेल एप्लिकेशन पा सकते हैं, भले ही सिस्टम पर एक ही ऐप के कई संस्करण हों।

यह एकमात्र तरीका है जिसे मैं सभी एप्लिकेशन प्राप्त करने के बारे में जानता हूं, सिस्टम को 'डिफ़ॉल्ट' या 'पसंदीदा' एप्लिकेशन को अन्य कॉल के साथ वापस करने के बजाय क्या होता है।

+0

सही- यह उन मामलों के लिए बहुत अच्छी तरह से काम करता है जहां आप ढूंढने वाले ऐप्स अद्वितीय URL योजनाएं घोषित करते हैं। यकीन नहीं है कि उन ऐप्स के लिए यह मामला है जब मैं कुछ साल पहले यह पूछता था, हालांकि। (और एसओ में आपका स्वागत है!) – rickster

+0

सच है, और मैंने उस आवश्यकता को निर्दिष्ट करने के लिए अपना उत्तर अपडेट किया। – coderSeb

+0

मेरा उत्तर देखें: LSCopyApplicationURLsForBundleIdentifier http://stackoverflow.com/a/37153167/754997 –

संबंधित मुद्दे