Come posso sapere se Voice Over è attivato in Preferenze di Sistema?
-
20-08-2019 - |
Domanda
C'è un modo, idealmente retrocompatibile con Mac OS X 10.3, per dire se " Voice Over " è attivato in Preferenze di Sistema?
Soluzione
Questo sembra essere memorizzato in un file delle preferenze per Universal Access. L'identificatore dell'app è & Quot; com.apple.universalaccess & Quot; e la chiave che contiene il flag per sapere se VoiceOver è attivo o meno è " voiceOverOnOffKey " ;. Dovresti essere in grado di recuperarlo utilizzando l'API CFPreferences, qualcosa del tipo:
CFBooleanRef flag = CFPreferencesCopyAppValue(CFSTR("voiceOverOnOffKey"), CFSTR("com.apple.universalaccess"));
Altri suggerimenti
Basato sulla risposta eccellente di Petes I & # 8217; ho creato questa soluzione Swift 4.2 , che trovo molto più facile da leggere. Penso anche che & # 8217; è più utile usare una proprietà calcolata in questo caso invece di una funzione.
var hasVoiceOverActivated: Bool {
let key = "voiceOverOnOffKey" as CFString
let id = "com.apple.universalaccess" as CFString
if let voiceOverActivated = CFPreferencesCopyAppValue(key, id) as? Bool {
return voiceOverActivated
}
return false
}
VoiceOver e Accessibilità in generale sono argomenti molto importanti ed è triste che la mancanza di documentazione sulle mele, specialmente per macOS, renda così difficile per gli sviluppatori implementarla correttamente.
Se qualcuno ha la stessa domanda, potrebbe essere utile sapere che lo stato di Voice Over è ora accessibile tramite una comoda interfaccia:
NSWorkspace.shared.isVoiceOverEnabled
La soluzione in Swift 4 è la seguente:
func NSIsVoiceOverRunning() -> Bool {
if let flag = CFPreferencesCopyAppValue("voiceOverOnOffKey" as CFString, "com.apple.universalaccess" as CFString) {
if let voiceOverOn = flag as? Bool {
return voiceOverOn
}
}
return false
}
Inoltre, per fare un annuncio di testo con VoiceOver su macOS, procedi come segue:
let message = "Hello, World!"
NSAccessibilityPostNotificationWithUserInfo(NSApp.mainWindow!,
NSAccessibilityNotificationName.announcementRequested,
[NSAccessibilityNotificationUserInfoKey.announcement: message,
NSAccessibilityNotificationUserInfoKey.priority:
NSAccessibilityPriorityLevel.high.rawValue])