Estoy usando una aplicación bastante antigua llamada Proximity para activar Applecripts cuando mi teléfono entra y sale rango de bluetooth de mi mac. Junto con otras tareas, quiero asegurar mi computadora portátil cuando el teléfono está fuera de alcance (habilitar el protector de pantalla y la contraseña), luego deshabilitar el requisito de contraseña cuando mi teléfono vuelva a estar dentro del rango.
Antes de 10.9
Tuve este trabajo (en su mayoría) en OS 10.8 y anteriores. Cuando mi teléfono se salió del alcance, pude correr:
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
tell application "System Events"
set ss to screen saver "Soundstream"
start ss
end tell
El notifyScreensaver
es un programa compilado en C que hace que el protector de pantalla vuelva a leer las preferencias de requisitos de contraseña (de esta publicación en el foro ).
Esto habilitaría el requisito de una contraseña y luego ejecutaría el protector de pantalla de inmediato. Este fue el comportamiento correcto para si mi computadora portátil estuviera en un entorno público. Sin embargo, cuando estaba en casa, no quería tener que ingresar la contraseña cada vez que salía de la habitación y regresaba un minuto después. Entonces agregando otra capa de complejidad:
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
set ssid to getWifiSSID()
if ssid is equal to "RouterName" then
(* if at home, only enable password requirement without triggering screensaver *)
else
(* if not at home, lock screen immediately *)
tell application "System Events"
set ss to screen saver "Soundstream"
start ss
end tell
end if
on getWifiSSID()
set theWiFi to do shell script "wifi='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}''
echo $wifi
"
return theWiFi
end getWifiSSID
Usando esto, cuando estoy en casa, solo necesito ingresar mi contraseña si mi teléfono está fuera del alcance Y si mi computadora ha estado inactiva durante el tiempo suficiente para activar el tiempo de espera del protector de pantalla (~ 20 minutos).
Cuando mi teléfono volviera al rango, correría:
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
Si el protector de pantalla ya se estaba ejecutando, uno todavía tendría que escribir la contraseña para desbloquear la computadora, pero la contraseña no se requeriría si el protector de pantalla se reiniciara más tarde.
Hubo un pequeño problema aquí: ocasionalmente (creo que cuando no hubo comentarios del usuario entre el momento en que se ejecutó el script fuera de rango y el script dentro del rango, y el protector de pantalla se había habilitado), la pantalla sería completamente negra en lugar de mostrar el mensaje de contraseña para desbloquear la computadora. Sin embargo, en este caso podría ingresar al campo de contraseña y escribir la contraseña a ciegas para desbloquear la computadora.
En 10.9
El cambio más significativo que he encontrado en 10.9 ocurre cuando la contraseña y el protector de pantalla están habilitados y luego la contraseña se deshabilita, sin ninguna entrada por parte del usuario. Cuando vuelvo para desbloquear la computadora, el protector de pantalla no requiere una contraseña e inmediatamente vuelve al escritorio. Sin embargo, el protector de pantalla sigue atrapado en el teclado: puedo interactuar con los programas con el mouse, pero cualquier pulsación de tecla solo provoca un sonido de alerta de advertencia ("Funk" de las alertas estándar).
Un ejemplo mínimo que causa este comportamiento es:
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
tell application "System Events"
set ss to screen saver "Soundstream"
start ss
end tell
delay 5
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
La forma principal que he encontrado para salir de este estado semicerrado es volver a habilitar el requisito de contraseña y volver a ejecutar el protector de pantalla, y luego ingresar la contraseña manualmente.
El comportamiento más ideal (en mi opinión) sería bloquear mi computadora tan pronto como mi teléfono se salga del alcance, luego desbloquearlo automáticamente (sin el requisito de escribir una contraseña) cuando mi teléfono vuelva a estar dentro del rango . Sin embargo, desde las versiones anteriores del sistema operativo he estado trabajando bajo el supuesto de que se requiere la entrada del usuario para desbloquear la computadora después de que se hayan activado el protector de pantalla y el requisito de contraseña. Con esta restricción, el comportamiento deseado es simplemente restaurar la funcionalidad que estaba presente antes de la versión 10.9: poder escribir la contraseña para desbloquear la computadora cuando esté nuevamente dentro del rango, pero no volver a requerir una contraseña hasta que el teléfono salga del alcance.
¿Alguna sugerencia sobre cómo lograr esto?