2 votos

¿Cómo activar el DND automáticamente?

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)?

2voto

aaplmath Puntos 599

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:

  1. No se puede programar la activación y desactivación de "No molestar" a determinadas horas (consulte las Preferencias del sistema).
  2. 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 Welcome to Xcode panel

  • Seleccione macOS en la parte superior del desplegable que aparece, y luego seleccione Command Line Tool bajo la Application y haga clic en Next New project type selector

  • 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 a Swift ¡! Project options panel

  • 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 Source control and group options

  • 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 en Next Header file type selection

  • 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ía BatteryDetector-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 en Create . File group and location dialog

  • 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, seleccione Build Settings en la parte superior del panel principal, y asegúrese de que All está seleccionada debajo de ella (véase la captura de pantalla siguiente) Build settings screen

  • 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 llamado Objective-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ía BatteryDetector/BatteryDetector-Bridging-Header.h . A continuación, pulse return . Objective-C Bridging Header build setting

  • 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 en main.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 un Export botón. Haga clic en Export , seleccione Built Products y haga clic en Next . Archive screen

  • 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 (probablemente usr , local , bin ) hasta encontrar el ejecutable llamado BatteryDetector (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:

0voto

sdmeyers Puntos 1356

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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X