objective-c - १९९९ - सामाजिक न्याय विभाग भारत सरकार




10.9 पर प्रोग्रामेटिक रूप से सहायक उपकरणों के लिए पहुंच सक्षम करें (6)

मैं 10.9 पर प्रोग्रामिक रूप से सहायक उपकरणों के लिए पहुंच को सक्षम करना चाहता हूं। 10.8 और निचले स्तर पर मैं सहायक उपकरणों के लिए पहुंच सक्षम करने के लिए निम्नलिखित एप्पलस्क्रिप्ट का उपयोग कर रहा था:

tell application "System Events"
if UI elements enabled is false then
    set UI elements enabled to true
end if
end tell

10.9 के साथ, ऐप्पल ने सिस्टम प्राथमिकता ➞ सुरक्षा और गोपनीयता ➞ गोपनीयता ➞ पहुंच के लिए पहुंच विकल्प को स्थानांतरित कर दिया है। ओएस एक्स के पिछले संस्करणों के विपरीत, जो सभी अनुप्रयोगों के लिए एक सार्वभौमिक चेकबॉक्स का उपयोग करता था, 10.9 में नई कार्यक्षमता उपयोगकर्ताओं को अलग-अलग चुनने देती है कि कौन से ऐप्स सिस्टम के विभिन्न स्क्रिप्टेड कार्यों को करने के लिए सिस्टम का नियंत्रण प्राप्त कर सकते हैं।

ऐप्पल ने ऐप के लिए प्रोग्रामेटिक रूप से पहुंच क्षमता को सक्षम करने के लिए डेवलपर्स को कोई एपीआई प्रदान नहीं किया है। इसलिए जब मैक ओएस 10.9 एक्सेसिबिलिटी एपीआई का उपयोग करता है तो एक्सेसिबिलिटी को सक्षम करने के लिए अंतिम उपयोगकर्ता अनुमति के लिए एक संवाद संकेत देगा। इसके अतिरिक्त उपयोगकर्ता को एक्सेसिबिलिटी सक्षम करने के बाद एप्लिकेशन को फिर से लॉन्च करना होगा।

क्या हम एप्पलस्क्रिप्ट या किसी अन्य एपीआई का उपयोग करके 10.9 पर प्रोग्रामेटिक रूप से सहायक उपकरणों तक पहुंच सक्षम कर सकते हैं? इस मुद्दे को ठीक करने में कोई मदद की सराहना की जाएगी।


@NightFlight से इस शेल स्क्रिप्ट नमूने के लिए धन्यवाद, जो वास्तव में सहायक हैं। मैंने इसे पाइथन एप्लिकेशन में ऐप्पलस्क्रिप्ट के साथ प्रयोग किया, जैसा कि निम्न है:

set sh to "touch /private/var/db/.AccessibilityAPIEnabled && sqlite3 \\"/Library/Application Support/com.apple.TCC/TCC.db\\" \\"INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','com.godevnode',0,1,0,NULL);\\""
do shell script sh with administrator privileges

यह एक स्ट्रिंग के रूप में पाइथन कोड में मेरे लिए अच्छा काम किया।

संपादित करें (7 नवंबर, 2014):

यदि आप ऐप्पलस्क्रिप्ट संपादक में यह कोशिश करना चाहते हैं, तो नीचे दिए गए थोड़ा अलग चरित्र से बचें:

set sh to "touch /private/var/db/.AccessibilityAPIEnabled && sqlite3 \"/Library/Application Support/com.apple.TCC/TCC.db\" \"INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','com.godevnode',0,1,0,NULL);\""
do shell script sh with administrator privileges

10.9 से पहले मैक ओएस एक्स के लिए, यह भी आसान है:

accessibility_api_file = "/private/var/db/.AccessibilityAPIEnabled"

def __enable_accessibility_api():
    try:
        script = 'do shell script "touch %s" with administrator ' \
                 'privileges' % accessibility_api_file
        result = applescript.AppleScript(script).run()
        log.debug("Tried to enable accessibility api, result=" + result)
        return True
    except applescript.ScriptError as err:
        log.error(str(err))
    return False

बस एक फ़ाइल को छूने की जरूरत है। उपरोक्त पायथन कोड में वर्णित ऐप्पलस्क्रिप्ट का उपयोग अन्य भाषाओं में भी किया जा सकता है।


Sqlite3 "हैक" महान है।

मुझे यह काम करने के लिए "1,1,1" (जो भी इसका मतलब है) अनुमतियों का उपयोग करना पड़ा।

ध्यान दें कि अनुमति संयोजन, ग्राहक नहीं (यानी प्रोग्राम नाम) अद्वितीय डेटाबेस कुंजी है।


जबकि @ user2865860 का उत्तर अच्छी तरह से काम करता है, हालांकि मैं पूरे कोड नमूना पोस्ट करता हूं जो कुछ समय बचाने के लिए 10.9 पर पूरी तरह से काम करता है। आपको रूट विशेषाधिकार प्राप्त करने की आवश्यकता है, इसलिए यह उपयोगकर्ता को पासवर्ड दर्ज करने के लिए संकेत देगा।

char *command= "/usr/bin/sqlite3";
char *args[] = {"/Library/Application Support/com.apple.TCC/TCC.db", "INSERT or REPLACE INTO access  VALUES('kTCCServiceAccessibility','com.yourapp',0,1,0,NULL);", nil};
AuthorizationRef authRef;
OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
if (status == errAuthorizationSuccess) {
    status = AuthorizationExecuteWithPrivileges(authRef, command, kAuthorizationFlagDefaults, args, NULL);
    AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
    if(status != 0){
        //handle errors...
    }
}

मुझे निम्न कोड स्निपेट मिला है जो ओएस एक्स 10.9 में एक्सेसिबिलिटी अनुमतियों का उचित अनुरोध करता है:

if (AXIsProcessTrustedWithOptions != NULL) {
    // 10.9 and later
    const void * keys[] = { kAXTrustedCheckOptionPrompt };
    const void * values[] = { kCFBooleanTrue };

    CFDictionaryRef options = CFDictionaryCreate(
            kCFAllocatorDefault,
            keys,
            values,
            sizeof(keys) / sizeof(*keys),
            &kCFCopyStringDictionaryKeyCallBacks,
            &kCFTypeDictionaryValueCallBacks);

    return AXIsProcessTrustedWithOptions(options);
}

// OS X 10.8 and older

यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन 10.9 में दिखाई देने वाली एक नई एपीआई कॉल के बारे में जानना अच्छा होता है और आपको प्राधिकरण स्क्रीन प्रदर्शित करने या इसे बाईपास करने देता है:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);

YES पास करने से प्राधिकरण स्क्रीन दिखाई देगी, NO गुजरने से चुपचाप इसे छोड़ दिया जाएगा। वापसी मूल्य AXAPIEnabled() द्वारा लौटाए गए जैसा ही है, जो 10.9 में बहिष्कृत हो रहा है। यह सुनिश्चित करने के लिए कि फ़ंक्शन आपके सिस्टम पर उपलब्ध है, बस इसे NULL से तुलना करें:

if (AXIsProcessTrustedWithOptions != NULL) {
    // 10.9 and later
} else {
    // 10.8 and older
}

आपको अपनी परियोजना में ApplicationServices.framework जोड़ने की आवश्यकता होगी, और अपनी .m या .h फ़ाइल में आयात करें:

#import <ApplicationServices/ApplicationServices.h>

यह काफी दयालु है कि प्राधिकरण स्क्रीन उपयोगकर्ता को ऐप को सीधे अधिकृत करने की अनुमति नहीं देती है, यह सिर्फ सिस्टम प्राथमिकताओं का सही हिस्सा खुलती है। जो, वैसे, आप बेकार प्रणाली संवाद के बिना सीधे कर सकते हैं:

tell application "System Preferences"
    set securityPane to pane id "com.apple.preference.security"
    tell securityPane to reveal anchor "Privacy_Accessibility"
    activate
end tell

या उद्देश्य सी का उपयोग कर:

NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];

यह जांचने के लिए पहले कोड स्निपेट के साथ जोड़ा जा सकता है कि क्या accessibilityEnabled लिए सिस्टम को पॉप-अप को रोकने के दौरान @NO को kAXTrustedCheckOptionPrompt को पास @NO सक्षम किया गया है और इसके बजाय एक्सेसिबिलिटी वरीयता फलक को सीधे खोलना:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @NO};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);
if (!accessibilityEnabled) {
    NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];
}

सबको धन्यवाद।

मैं लॉगिन विंडो से निम्नलिखित ट्रिगर करता हूं ताकि यह सुनिश्चित किया जा सके कि नियंत्रण केवल उन वस्तुओं को दिया जाता है जिन्हें हम हर सत्र चाहते हैं:

# Enable Service Accessibility for Textpander and others  
# Clear the acess table.
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "DELETE FROM access"

# Enter the access we wish to have.
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES ('kTCCServiceAccessibility','com.apple.systempreferences',0,1,1,NULL)"
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES ('kTCCServiceAccessibility','de.petermaurer.textpanderdaemon',0,1,1,NULL)"




accessibility-api