Jak automatycznie aktywować DND?

2

Używam MacBooka Pro w pracy, która przez większość czasu jest podłączona do stacji dokującej za pomocą kabla błyskawicy na moim biurku. Tam zwykle wyłączam tryb Nie przeszkadzać (DND) i aktywuję wygaszacz ekranu / blokadę ekranu po 2 minutach. Kiedy jestem na spotkaniach, zdarza się regularnie, że chcę coś przedstawić, ale wtedy denerwujące jest wyświetlanie powiadomień lub włączenie wygaszacza ekranu po 2 minutach. Jak mogę automatycznie włączyć tryb DND i automatycznie wyłączyć wygaszacz ekranu, gdy MacBook nie jest podłączony do zasilania (stacja dokująca)?

Peleke
źródło

Odpowiedzi:

1

Jedynym sposobem, w jaki mogę to uruchomić, jest zbudowanie małej aplikacji wiersza polecenia Swift. Działa całkiem dobrze, z dwoma głównymi zastrzeżeniami:

  1. Nie można zaplanować włączania i wyłączania funkcji Nie przeszkadzać w określonych godzinach (sprawdź Preferencje systemowe)
  2. Element paska menu zawsze wygląda tak, jakby funkcja Nie przeszkadzać była włączona, nawet jeśli nie jest

Jeśli jednak te zastrzeżenia nie są wielkim problemem, aplikacja zrobi wszystko, czego potrzebujesz: zapobiega uśpieniu wyświetlacza i włącza funkcję Nie przeszkadzać, gdy jest na baterii, i odwraca te ustawienia po podłączeniu do zasilania sieciowego. Oto (nieco zaangażowany) proces tworzenia tej aplikacji:

  • Zainstaluj Xcode z Mac App Store, jeśli jeszcze tego nie zrobiłeś
  • Otwórz Xcode i zainstaluj wszystkie niezbędne komponenty zgodnie z monitem
  • W oknie „Witamy w Xcode” wybierz Create a New Xcode Project Witamy w panelu Xcode
  • Wybierz macOSu góry rozwijanego menu, które się pojawi, a następnie wybierz Command Line Toolpod Applicationnagłówkiem i kliknijNext Nowy selektor typu projektu
  • Wpisz coś dla nazwy produktu - czyli nazwy, która pojawi się w Twojej aplikacji (zamierzam używać BatteryDetector) - i wypełnij pozostałe pola (tak naprawdę nie mają znaczenia); upewnij się, że język jest ustawiony na Swift! Panel opcji projektu
  • Wybierz gdzieś na komputerze, aby zapisać projekt (gdziekolwiek chcesz), odznacz pole tworzenia repozytorium Git i kliknij Create Kontrola źródła i opcje grupy
  • Po utworzeniu projektu (otworzy się nowe okno), wybierz File> New> File…lub naciśnij ⌘N, aby otworzyć okno dialogowe Nowy plik
  • Wybierz Header Filejako typ pliku i kliknijNext Wybór typu pliku nagłówka
  • Nazwij swój plik [your project name]-Bridging-Header.h, zastępując rzeczywistą nazwę projektu [your-project-name]. W moim przykładzie nazwa to BatteryDetector-Bridging-Header.h.
  • Upewnij się, że Groupw dolnej części okna dialogowego znajduje się żółta ikona folderu i zawiera nazwę twojego projektu. Jeśli ma niebieską ikonę lub coś innego, zmień ją na opcję, która ma żółtą ikonę folderu i nazwę projektu. Zobacz zrzut ekranu poniżej, aby uzyskać prawidłową konfigurację. Gdy wszystko jest w porządku, kliknij Create. Okno dialogowe grupy plików i lokalizacji
  • Po utworzeniu plik powinien zostać automatycznie otwarty. Gdy to nastąpi, usuń całą automatycznie wygenerowaną zawartość i wklej następujący kod. Poniższy kod powinien być jedynym kodem w pliku:

    #import <IOKit/ps/IOPowerSources.h>
    
  • Następnie wybierz projekt u góry hierarchii w lewym górnym rogu okna, następnie wybierz cel z Targetslisty, wybierz Build Settingsu góry głównego panelu i upewnij się, że Alljest wybrany poniżej (patrz zrzut ekranu poniżej) Ekran ustawień kompilacji

  • Aby wyszukać, użyj pola wyszukiwania w prawym górnym rogu ekranu Ustawienia kompilacji objective-c bridging header. Powinieneś zobaczyć ustawienie o nazwie Objective-C Bridging Headerprzyjść na górę listy.
  • Kliknij dwukrotnie po prawej stronie Objective-C Bridging Headeretykiety, aby pojawiło się pole tekstowe, i wprowadź [your-project-name]/[your-project-name]-Bridging-Header.hto pole tekstowe, zastępując [your-project-name]rzeczywistą nazwę projektu. W moim przykładzie wchodziłbym BatteryDetector/BatteryDetector-Bridging-Header.h. Następnie naciśnij return. Cel kompilacji Bridging Header kompilacji
  • Następnie kliknij main.swiftplik w drzewie plików po lewej stronie. Usuń cały zawarty w nim kod i wklej poniższy kod. Poniższy kod powinien być jedynym kodem w 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()
    
  • Następnie wyeksportuj aplikację, wybierając Product> Archivena pasku menu. Po zakończeniu archiwizacji pojawi się okno z Exportprzyciskiem. Kliknij Export, wybierz Built Productsi kliknij Next. Ekran archiwum

  • Wybierz lokalizację, w której chcesz zapisać eksportowany plik wykonywalny na dysku, a następnie kliknij Export.
  • Teraz przejdź do folderu, po prostu zapisane na dysku (tzw [your-project-name] [today's-date]) i przejdź przez wszystkie podfoldery (chyba usr, local, bin), aż znajdziesz plik wykonywalny o nazwie BatteryDetector(lub cokolwiek nazwie projektu). Możesz zapisać ten plik wykonywalny w dowolnym miejscu na dysku, ale powinien on znajdować się w stabilnej lokalizacji (tj. W miejscu, z którego nie planujesz go przenieść), inaczej komputer nie będzie w stanie go zlokalizować.
  • Następnie skopiuj następujący tekst i wklej go do programu do edycji tekstu, takiego jak TextEditlub edytora kodu (upewnij się, że nie przekształci on cudzysłowów w „inteligentne cudzysłowy”). Zamień tekst [your-executable-location]na pełną ścieżkę do miejsca, w którym plik wykonywalny jest przechowywany na dysku (np /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>
    
  • Po wprowadzeniu poprawnej ścieżki skopiuj nowo zmodyfikowany tekst (tj. Z poprawioną ścieżką) do schowka.

  • Następnie otwórz Terminal (znajduje się w /Applications/Utilities/Terminal.app).
  • Wpisz następujące polecenie w Terminalu dokładnie tak, jak jest tutaj napisane, a następnie naciśnij return. Czy nie kopiuj i wklej go-komenda będzie działać tylko wtedy, gdy tekst jest po prostu zmodyfikowany obecnie w schowku:test -e ~/Library/LaunchAgents || mkdir ~/Library/LaunchAgents; pbpaste > ~/Library/LaunchAgents/com.launchagent.batterydetector
  • Na koniec wyloguj się, a następnie zaloguj ponownie, aby uruchomić aplikację. Będzie nadal działał w tle i będzie automatycznie uruchamiany przy każdym logowaniu. Jeśli musisz z jakiegoś powodu wyjść, użyj Monitora aktywności i wyszukaj nazwę swojego pliku wykonywalnego (np BatteryDetector.).

Oto kilka źródeł z dodatkowymi informacjami o niektórych kodach, których używam:

aaplmath
źródło
Wow, wielkie dzięki za bardzo szczegółową sugestię.
Peleke
0

Nie jestem pewien, czy na to wszystko jest łatwa odpowiedź; jednak kilka rzeczy, które mogą pomóc:

W przypadku wygaszacza ekranu możesz aktywować gorący narożnik, aby wyłączyć wygaszacz ekranu.

Osobiście nie używam wygaszacza ekranu i raczej przyzwyczaiłem się do ręcznego blokowania ekranu, kiedy wstaję w pracy (Ctl + Cmd + Q).

Możesz także ustawić oszczędzanie energii tak, aby wyłączała wyświetlacz w różnym czasie w zależności od pogody, kiedy jesteś zasilany lub z baterii, a także ustawić zabezpieczenia, aby wymagać hasła po przebudzeniu ze snu.

Powiadomienia są uciążliwe (większość z nich została wyłączona).

Jednym z możliwych rozwiązań jest jednak Preferencje powiadomień, które można włączyć w ustawieniach, które włączą się automatycznie. Nie przeszkadzaj „Podczas tworzenia kopii lustrzanych na telewizorach lub projektorach”, więc jeśli tworzysz kopię lustrzaną podczas prezentacji, to zadziała.

sdmeyers
źródło