Utilizo un MacBook Pro en el trabajo que está la mayor parte del tiempo conectado a una estación de acoplamiento mediante un cable lightning en mi escritorio. Allí suelo desactivar el modo de no molestar (DND) y activar el salvapantallas/bloqueo de pantalla después de 2 minutos. Cuando estoy en reuniones me ocurre con regularidad que quiero presentar algo pero entonces es molesto que aparezcan notificaciones o que se active el salvapantallas después de 2 minutos. ¿Cómo puedo activar automáticamente el modo DND y desactivar el salvapantallas automáticamente cuando mi MacBook no está conectado a la corriente (estación de acoplamiento)?
Respuestas
¿Demasiados anuncios?La única manera de conseguir que esto funcione es construyendo una pequeña aplicación de línea de comandos Swift. Funciona bastante bien, con dos advertencias importantes:
- No se puede programar la activación y desactivación de "No molestar" a determinadas horas (consulte las Preferencias del sistema).
- El elemento de la barra de menús siempre parece que la opción No molestar está activada, aunque no lo esté
Sin embargo, si estas advertencias no son un gran problema, la aplicación hace todo lo demás que necesitas: evita que la pantalla entre en reposo y activa la función No molestar cuando está en la batería, e invierte esos ajustes cuando te conectas a la corriente alterna. Este es el proceso (ligeramente complicado) para crear esta aplicación:
-
Instalar Xcode de la Mac App Store si aún no lo ha hecho
-
Abra Xcode e instale los componentes necesarios según se le solicite
-
En la ventana "Bienvenido a Xcode", seleccione
Create a New Xcode Project
-
Seleccione
macOS
en la parte superior del desplegable que aparece, y luego seleccioneCommand Line Tool
bajo laApplication
y haga clic enNext
-
Introduzca algo para el nombre de su producto, que es el nombre que aparecerá en su aplicación (voy a utilizar
BatteryDetector
)- y rellenar los demás campos (no tienen importancia); asegúrese de que el idioma está ajustado aSwift
¡! -
Selecciona algún lugar de tu ordenador para guardar el proyecto (donde quieras), desmarca la casilla para crear un repositorio Git y haz clic en
Create
-
Una vez creado el proyecto (se abrirá una nueva ventana), seleccione
File
>New
>File…
o pulse ⌘N para abrir el diálogo de Nuevo Archivo -
Seleccione
Header File
como tipo de archivo y haga clic enNext
-
Nombre de su archivo
[your project name]-Bridging-Header.h
sustituyendo el nombre de su proyecto real por[your-project-name]
. En mi ejemplo, el nombre seríaBatteryDetector-Bridging-Header.h
. -
Asegúrese de que el
Group
en la parte inferior del diálogo tiene un icono de carpeta amarilla al lado y dice el nombre de su proyecto. Si tiene un icono azul o algo más, cámbielo por la opción que tiene un icono de carpeta amarilla y el nombre de su proyecto. Vea la captura de pantalla de abajo para la configuración correcta. Cuando todo esté correcto, haga clic enCreate
. -
Una vez creado el archivo, debería abrirse automáticamente. Una vez que lo esté, borre todo del contenido autogenerado y pegar el siguiente código. El código de abajo debe ser el sólo código en el archivo:
#import <IOKit/ps/IOPowerSources.h>
-
A continuación, seleccione el proyecto en la parte superior de la jerarquía en la parte superior izquierda de la ventana, a continuación, seleccione el objetivo bajo el
Targets
lista, seleccioneBuild Settings
en la parte superior del panel principal, y asegúrese de queAll
está seleccionada debajo de ella (véase la captura de pantalla siguiente) -
Utilice el cuadro de búsqueda situado en la parte superior derecha de la pantalla de configuración de la construcción para buscar
objective-c bridging header
. Debería ver un ajuste llamadoObjective-C Bridging Header
llegan a la cima de la lista. -
Haga doble clic a la derecha del
Objective-C Bridging Header
para que aparezca un cuadro de texto, e introduzca[your-project-name]/[your-project-name]-Bridging-Header.h
en ese cuadro de texto, sustituyendo[your-project-name]
con el nombre real de su proyecto. En mi ejemplo, introduciríaBatteryDetector/BatteryDetector-Bridging-Header.h
. A continuación, pulse return . -
A continuación, haga clic en el botón
main.swift
en el árbol de archivos de la izquierda. Borrar todo del código que contiene, y pegar el código de abajo. El siguiente código debe ser el sólo código enmain.swift
:import Cocoa var context = 0 var proc: Process! func enableDND() { CFPreferencesSetValue("doNotDisturb" as CFString, true as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) CFPreferencesSetValue("doNotDisturbDate" as CFString, Date() as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) commitDNDChanges() } func disableDND() { CFPreferencesSetValue("doNotDisturb" as CFString, false as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) CFPreferencesSetValue("doNotDisturbDate" as CFString, nil, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) commitDNDChanges() } func commitDNDChanges() { CFPreferencesSynchronize("com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) DistributedNotificationCenter.default().postNotificationName(NSNotification.Name(rawValue: "com.apple.notificationcenterui.dndprefs_changed"), object: nil, userInfo: nil, deliverImmediately: true) NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.notificationcenterui").first?.terminate() } func startCaffeinate() { proc = Process() proc.launchPath = "/usr/bin/caffeinate" proc.arguments = ["-d", "-i"] proc.launch() } func stopCaffeinate() { proc.terminate() } let loop = IOPSNotificationCreateRunLoopSource({(context: UnsafeMutableRawPointer?) in let snap = IOPSCopyPowerSourcesInfo().takeRetainedValue() as CFTypeRef let source = IOPSGetProvidingPowerSourceType(snap).takeRetainedValue() as String if source == "Battery Power" { enableDND() startCaffeinate() } else { disableDND() stopCaffeinate() } }, &context).takeRetainedValue() as CFRunLoopSource CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, .defaultMode) RunLoop.main.run()
-
A continuación, exporte la aplicación seleccionando
Product
>Archive
en la barra de menús. Una vez que el archivo termine, aparecerá una ventana con unExport
botón. Haga clic enExport
, seleccioneBuilt Products
y haga clic enNext
. -
Seleccione la ubicación en la que guardará el ejecutable exportado en su disco, y luego haga clic en
Export
. -
Ahora, navegue hasta la carpeta que acaba de guardar en su disco (llamada
[your-project-name] [today's-date]
) y navegar por todas las subcarpetas (probablementeusr
,local
,bin
) hasta encontrar el ejecutable llamadoBatteryDetector
(o el nombre que le hayas puesto a tu proyecto). Puedes almacenar este ejecutable en cualquier lugar del disco, pero debe estar en una ubicación estable (es decir, una ubicación de la que no planees moverlo) o tu ordenador no podrá localizarlo. -
A continuación, copie el siguiente texto y péguelo en un programa de edición de textos como
TextEdit
o un editor de código (asegúrese de que no convierte las comillas en "comillas inteligentes"). Reemplace el texto[your-executable-location]
con la ruta completa del lugar donde se almacena el ejecutable en el disco (por ejemplo/Applications/BatteryDetector
).<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.launchagent.batterydetector</string> <key>Program</key> <string>[your-executable-location]</string> <key>RunAtLoad</key> <true/> </dict> </plist>
-
Una vez que haya introducido la ruta correcta, copie el texto recién modificado (es decir, con la ruta corregida) en el portapapeles.
-
A continuación, abra el Terminal (situado en
/Applications/Utilities/Terminal.app
). -
Escriba lo siguiente en el Terminal, exactamente como está escrito aquí, y luego pulse return . Haga no Copiar y pegar: el comando sólo funcionará si el texto que acaba de modificar se encuentra en el portapapeles:
test -e ~/Library/LaunchAgents || mkdir ~/Library/LaunchAgents; pbpaste > ~/Library/LaunchAgents/com.launchagent.batterydetector
-
Por último, cierra la sesión y vuelve a entrar para que la aplicación empiece a funcionar. Seguirá ejecutándose en segundo plano y se iniciará automáticamente cada vez que te conectes. Si necesitas salir de ella por alguna razón, utiliza el Monitor de Actividad y busca el nombre de tu ejecutable (por ejemplo
BatteryDetector
).
Aquí hay algunas fuentes con más información sobre algunos de los códigos que estoy utilizando:
No estoy seguro de que haya una respuesta fácil a todo esto; sin embargo, hay algunas cosas que pueden ayudar:
Para el salvapantallas, podrías activar una esquina caliente para desactivar el salvapantallas.
Personalmente no uso el salvapantallas y más bien he adquirido la costumbre de bloquear manualmente mi pantalla cuando me levanto en el trabajo (Ctl + Cmd + Q).
También puedes configurar el ahorro de energía para que la pantalla se apague a diferentes horas dependiendo de si estás con energía o con batería, también puedes configurar la seguridad para que se requiera una contraseña al despertar del sueño.
Las notificaciones son un dolor (tengo la mayoría de ellas desactivadas).
Sin embargo, una posible solución es que en la Preferencia de Notificaciones se puede activar un ajuste que automáticamente activará la opción No molestar "Cuando se refleja en televisores o proyectores", así que si se refleja durante las presentaciones, esto funcionaría.