मैं ऐसे ऐप पर काम कर रहा हूं जहां वैश्विक कुंजी-डाउन ईवेंट का उपयोग करना इसके संचालन के लिए एक आवश्यकता होगी। इसके अतिरिक्त, मैं ऐप स्टोर के माध्यम से इसे सख्ती से वितरित करने की योजना बना रहा हूं। (यह एक मैक ऐप है, आईओएस नहीं।) मुझे addGlobalMonitorForEventsMatchingMask के माध्यम से काम कर रहे वैश्विक कार्यक्रमों को सुनने का एक उदाहरण मिला है, लेकिन चेतावनी के साथ।वैश्विक घटनाएं, मैक ऐप स्टोर, और सैंडबॉक्स
नोट: मैं आधुनिक एपीआई का उपयोग करने और पहले कार्बन हॉटकी विधियों पर भरोसा करने का विकल्प नहीं बना रहा हूं। अगर वे अंततः बहिष्कृत हो जाते हैं, तो मैं बाद में इस समस्या को समझना नहीं चाहता हूं।
सिद्धांत मुद्दा यह है कि वैश्विक घटनाओं का पता लगाने के लिए ऐप को भरोसा किया जाना चाहिए। अन्यथा, सभी ऐप्स के लिए अभिगम्यता सक्षम होना आवश्यक है। जब मैं अभिगम्यता को सक्षम करता हूं, तो ईवेंट सफलतापूर्वक पता चला है। यह आवश्यकता यहां दस्तावेज है, http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html।
मैं इसे अपने उपयोगकर्ताओं के लिए पसंद करूंगा, उन्हें पहुंच क्षमता को सक्षम नहीं करना होगा। मैंने किए गए अन्य शोधों से, आप AXMakeProcessTrusted को कॉल करके विश्वसनीय होने के लिए एप्लिकेशन प्राप्त कर सकते हैं, फिर एप्लिकेशन को पुनरारंभ करना।
मैं जिस कोड का उपयोग कर रहा हूं, मुझे प्रमाणीकरण प्रॉम्प्ट नहीं मिलता है। ऐप पुनरारंभ होगा, लेकिन अभी भी भरोसा नहीं है (संभवतः क्योंकि मुझे प्रमाणीकरण प्रॉम्प्ट नहीं मिलता है)।
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
NSString *appPath = [[NSBundle mainBundle] bundlePath];
AXError error = AXMakeProcessTrusted((CFStringRef)CFBridgingRetain(appPath));
[self restartApp];
}
}
- (void)restartApp{
NSTask *task = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"-c"];
[args addObject:[NSString stringWithFormat:@"sleep %d; open \"%@\"", 3, [[NSBundle mainBundle] bundlePath]]];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:args];
[task launch];
[NSApp terminate:nil];
}
इसके अलावा, मैं प्राधिकरण सेवा कार्य यहां https://developer.apple.com/library/mac/#documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-BCIGAIAG के लिए दस्तावेज़ देखा है: यहाँ इस हिस्से के लिए अपने कोड है।
पहली बात जो मुझे चिंतित करती है, वह इस जानकारी बॉक्स है, "महत्वपूर्ण प्राधिकरण सेवा एपीआई ऐप सैंडबॉक्स के भीतर समर्थित नहीं है क्योंकि यह विशेषाधिकार वृद्धि को अनुमति देता है।"
यदि इस एपीआई को ऐप को पुनरारंभ करने से पहले प्रमाणीकरण प्रॉम्प्ट प्राप्त करने की आवश्यकता है, तो ऐसा लगता है कि मैं एक्सेसिबिलिटी सुविधा सक्षम किए बिना वैश्विक ईवेंट प्राप्त करने में सक्षम हूं।
सारांश में, मेरी विशिष्ट प्रश्न हैं:
वहाँ कैसे प्रमाणीकरण शीघ्र प्रकट करने के लिए प्राप्त करने के लिए के बारे में मेरे नमूना कोड में कोई त्रुटि है?
प्रमाणीकरण संकेत प्रकट करने के लिए, क्या मुझे प्राधिकरण सेवा API का उपयोग करने के लिए आवश्यक है?
क्या यह संभव है, या संभव नहीं है, एक सैंडबॉक्स वाला ऐप है जिसमें वैश्विक घटनाओं तक पहुंच है?
क्या आप इस के आसपास पाने के लिए प्रबंधन करते थे? मैंने एक ही समस्या पर ठोकर खाई है :( –
सीधे नहीं। वैश्विक हॉटकी के उद्देश्य के लिए, मुझे कोको हॉटकी का उपयोग करने का मार्ग जाना पड़ा। – Geuis
मैं भी उपयोगकर्ता को संकेत देने का एक तरीका ढूंढ रहा हूं। मेरा अनुमान एक इंस्टॉलर है ऐप इंस्टॉल होने पर आवश्यक अनुमतियों के साथ रूट के रूप में चलाया जाएगा और AXMakeProcessTrusted को कॉल करें। यदि इंस्टॉलर मैक ऐप स्टोर है तो इस अनुमति का अनुरोध करने के लिए एक हुक होना चाहिए। – Brennan