2011-05-14 1 views
6

पर प्रतिक्रिया दें, मैं कोको एप्लिकेशन में एक छोटा ऐप्पलस्क्रिप्ट समर्थन जोड़ने की कोशिश कर रहा हूं। आवेदन समय-समय पर चेक करता है और मैं इसे मांग पर प्रदर्शन करने के लिए कहने में सक्षम होना चाहता हूं।कोको एप्लिकेशन को सरल ऐप्पलस्क्रिप्ट कमांड

मैं SimpleScriptingVerbs ऐप्पल उदाहरण का पालन करने की कोशिश कर रहा हूं।

मैं NSScriptCommand subclassed है इस प्रकार है:

हैडर:

#import <Cocoa/Cocoa.h> 

@interface rdrNotifierUpdateCommand : NSScriptCommand { 

} 
-(id)performDefaultImplementation; 
@end 

कार्यान्वयन:

#import "rdrNotifierUpdateCommand.h" 
#import "rdrNotifierAppDelegate.h" 

@implementation rdrNotifierUpdateCommand 

-(id)performDefaultImplementation { 
    NSLog(@"Works at last"); 
    [((rdrNotifierAppDelegate *)[[NSApplication sharedApplication] delegate]) 
    checkForNewItems]; // This just fires the timer 
    return nil; 
} 
@end 

मेरे .sdef फ़ाइल इस प्रकार है (और समस्या हो रहा है, लेकिन मैं इसे नहीं मिला):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> 
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude"> 
    <xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/> 
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities."> 
     <command name="do update" code="rdrNUpdt" description="Check for new items"> 
      <cocoa class="rdrNotifierUpdateCommand"/> 
     </command> 
    </suite> 
</dictionary> 

Info.plist उचित रूप से स्थापित किया गया है।

लेकिन, जब मैं AppleScript संपादक में निम्न स्क्रिप्ट चलाने का प्रयास:

tell application "rdrNotifier" 
    do update 
end tell 

मैं चर "अद्यतन" के बारे में कोई त्रुटि प्राप्त परिभाषित नहीं किया जा रहा।

मैं ऐप्पलस्क्रिप्ट संपादक से अपने आवेदन के लिए शब्दकोश खोल सकता हूं (यानी यह सफलतापूर्वक पंजीकृत है)।

संपादित करें: मिला एक समाधान

समस्या sdef फ़ाइल में वास्तव में था: मैं निर्दिष्ट नहीं किया गया था कि आवेदन आदेश का जवाब दे सकते।

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> 
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude"> 
    <!-- I have removed the standard suite as the application does not open, print... --> 
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities."> 
    <command name="do update" code="rdrNUpdt" description="Check for new items"> 
     <cocoa class="rdrNotifierUpdateCommand"/> 
    </command> 
    <class name="application" code="Capp"> 
     <cocoa class="NSApplication"/> 
     <responds-to name="do update"> 
     <!-- Note you need to specify a method here, 
      although it is blank --> 
     <cocoa method=""/> 
     </responds-to> 
    </class> 
    </suite> 
</dictionary> 

किसी भी सुधार/सुझावों/आलोचनाओं अभी भी स्वागत कर रहे हैं: मेरा अंतिम परिभाषा के रूप में (Obj सी कोड में कोई बदलाव नहीं) इस प्रकार चला जाता है।

उत्तर

2

आपके ऐप पर सेबस्क्रिप्ट समर्थन जोड़ने का प्रयास करने के लिए धन्यवाद! बस एक त्वरित अवलोकन/आलोचना: शब्दावली का निर्माण करते समय, सभी साधनों से रिक्त स्थान शामिल होते हैं, लेकिन यदि वह शब्दावली 'क्रिया संज्ञा' (जैसे 'अपडेट करें') का रूप लेती है तो एप्पलस्क्रिप्टर्स परेशान होंगे यदि संज्ञा 'अपडेट' ठीक से नहीं है मॉडलिंग ऑब्जेक्ट, और यदि 'डू' उचित आदेश नहीं है।

मैं तर्क दूंगा कि 'डू' कमांड नाम के लिए एक खराब विकल्प है, क्योंकि यह बहुत अस्पष्ट है। कमांड के रूप में 'अपडेट' का उपयोग करने में क्या गलत है? (यानी इसे क्रिया के रूप में मानें)।

इस मुद्दे का ऐप्पल के अपने तकनीकी 2106 (वर्तमान में here) द्वारा कुछ विस्तार से व्यवहार किया जाता है, यदि आपको अपने ऐप्पलस्क्रिप्टिंग उपयोगकर्ता समुदाय को खुश करने की आशा है तो आपको निश्चित रूप से पढ़ना और पचाना चाहिए।

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

+0

मुझे तकनीकी को इंगित करने के लिए बहुत बहुत धन्यवाद।हां, "अद्यतन करें" मूर्खतापूर्ण लगता है; "करना" डालना (मेरा मतलब था "प्रदर्शन", लेकिन इसका उपयोग करने से बहुत अधिक मदद नहीं होगी) कोई समझ नहीं आता है। मैंने कोड को एक क्रिया में बदल दिया है और, वास्तव में, "अपडेट" भी फेंक दिया और "रीफ्रेश" के साथ समाप्त हो गया। –

+0

ताज़ा लगता है महान! :) बहुत ताज़ा – brennanyoung

+0

मैं यह देखने में असफल रहा कि यह दूरस्थ रूप से एक उत्तर कैसे है। – Volomike