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:
- Nie można zaplanować włączania i wyłączania funkcji Nie przeszkadzać w określonych godzinach (sprawdź Preferencje systemowe)
- 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
- Wybierz
macOS
u góry rozwijanego menu, które się pojawi, a następnie wybierz Command Line Tool
pod Application
nagłówkiem i kliknijNext
- 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
!
- Wybierz gdzieś na komputerze, aby zapisać projekt (gdziekolwiek chcesz), odznacz pole tworzenia repozytorium Git i kliknij
Create
- Po utworzeniu projektu (otworzy się nowe okno), wybierz
File
> New
> File…
lub naciśnij ⌘N, aby otworzyć okno dialogowe Nowy plik
- Wybierz
Header File
jako typ pliku i kliknijNext
- 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
Group
w 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
.
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 Targets
listy, wybierz Build Settings
u góry głównego panelu i upewnij się, że All
jest wybrany poniżej (patrz zrzut ekranu poniżej)
- 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 Header
przyjść na górę listy.
- Kliknij dwukrotnie po prawej stronie
Objective-C Bridging Header
etykiety, aby pojawiło się pole tekstowe, i wprowadź [your-project-name]/[your-project-name]-Bridging-Header.h
to 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.
Następnie kliknij main.swift
plik 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
> Archive
na pasku menu. Po zakończeniu archiwizacji pojawi się okno z Export
przyciskiem. Kliknij Export
, wybierz Built Products
i kliknij Next
.
- 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 TextEdit
lub 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:
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.
źródło