2013-05-12 7 views
6

मै मैक ऐप के भीतर से एक एप्पलस्क्रिप्ट फ़ाइल निष्पादित करने का एक तरीका ढूंढ रहा हूं। मैंने पिछले मैक अनुप्रयोगों को बनाया है जो NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"MY_CODE"]]; का उपयोग करते हैं, लेकिन मेरी एप्सस्क्रिप्ट काफी लंबा है और मैं बस अपनी प्रोजेक्ट के हिस्से के रूप में उस फ़ाइल को संदर्भित करने में सक्षम होना चाहता हूं, और इसकी सामग्री में पाइप (या केवल फ़ाइल को सीधे निष्पादित करना चाहता हूं) मेरे ऐप के भीतर से)।मैक ऐप में ऐप्पलस्क्रिप्ट फ़ाइल निष्पादित करें?

धन्यवाद!

+0

यदि आप यहां '[उद्देश्य-सी] सेबस्क्रिप्ट' खोजते हैं तो आपको क्या मिलेगा? –

उत्तर

2

अपने पैकेज में अपनी संकलित स्क्रिप्ट या स्क्रिप्ट टेक्स्ट क्यों न डालें और फिर एनएसएप्लस्क्रिप्ट के initWithContentsOfURL:error: method का उपयोग करें?

उदाहरण के लिए:

NSError * error = NULL; 
NSURL * resourceURL = [[NSBundle mainBundle] resourceURL]; 
NSURL * urlOfScript = [resourceURL URLByAppendingPathComponent: @"MyApplescript.scpt"]; 
NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL: urlOfScript error: &error]; 
if(script == NULL) 
{ 
    NSLog(@"could not instantiate script at %@ - %@", [urlOfScript absolutePath], [error localizedDescription]); 
} 
11

सैंडबॉक्स (10.8+) के बाहर उपयोगकर्ता के आपूर्ति AppleScripts चलाने के लिए, का उपयोग NSUserAppleScriptTask

आपके आवेदन बंडल में एम्बेडेड फ़ाइलें, या उपयोगकर्ता के आपूर्ति की स्क्रिप्ट .scpt चलाने के लिए 10.7 या उससे पहले में, NSAppleScript का उपयोग करें।

NSUserAppleScriptTask और NSAppleScript दोनों थोड़ा लंगड़ा हैं, आपको दिमाग है। न तो कोको और एएस प्रकारों के बीच स्वचालित डेटा रूपांतरण प्रदान करता है, जिसका अर्थ है पैरामीटर और परिणामों को पारित करने के लिए एनएसपीपीएलईएंड डिस्क्रिप्टर के साथ मैन्युअल मकिंग। एनएसपीप्लेस्क्रिप्ट उदाहरण आंशिक दृढ़ता समर्थन प्रदान करते हैं: स्क्रिप्ट के गुण एकाधिक हैंडलर कॉल में राज्य को बनाए रखते हैं, लेकिन बदले गए स्क्रिप्ट को डिस्क पर वापस सहेजने का कोई तरीका नहीं है, इसलिए इसे हटाए जाने के बाद कोई भी परिवर्तन खो जाता है। और NSUSerAppleScriptTask एक सख्ती से एक शॉट वाला मामला है, इसलिए स्क्रिप्ट राज्य कॉल के बीच बिल्कुल नहीं रहता है।

अपने एप्लिकेशन बंडल के रूप में एम्बेडेड AppleScript और ObjC कोड के बीच गहन एकीकरण के लिए, का उपयोग AppleScriptObjC (10.6+):

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

एएसओसी सही नहीं है (ऐप्पल के अपने दस्तावेज़ चूसते हैं, ब्रिजिंग टोल-फ्री नहीं है, और ग्लिच अज्ञात नहीं हैं), लेकिन ओबीजेसी से स्क्रिप्ट करने योग्य ऐप्स के साथ बातचीत करने के लिए यह अन्यथा बदले में विकल्प का सबसे अच्छा विकल्प है ।

+0

पैरामीटर पास करने के लिए कोई तरीका? या हमें हर बार जब इसे कॉल करने की आवश्यकता है (गरीब आदमी के पैरामीटर) तर्कों के साथ एक नई स्क्रिप्ट बनाना है? –

+0

कमांड लाइन उपयोगिता 'osascript' [एक सभ्य तरीके से समर्थन तर्क] (http://hints.macworld.com/article.php?story=20050523140439734)। मुझे आशा है कि उद्देश्य-सी या स्विफ्ट में कुछ भी संभव है। –

+1

['NSAppleScript' /' NSUserAppleScriptTask'] का उपयोग करके (http://appscript.sourceforge.net/nsapplescript.html)। ['AppleScriptObjC'] का उपयोग करना (http://appscript.sourceforge.net/asoc.html)। – foo

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