Sind Sie bereit, eine coole Rathausuhr-App für Ihren Mac zu erstellen? Großartig! Wir werden eine App erstellen, die in Ihrer Menüleiste angezeigt wird, alle 15 Minuten ertönt und sogar die Stunden zählt. Lass es uns Schritt für Schritt aufschlüsseln und ich erkläre jeden Teil des Codes, damit du verstehst, was los ist.
Unsere Rathausuhr-App wird:
Das Wichtigste zuerst: Lasst uns unser Projekt einrichten:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Jetzt erstellen wir unsere main.go-Datei und gehen jede Funktion durch:
package main import ( "bytes" "log" "os" "path/filepath" "time" "github.com/faiface/beep" "github.com/faiface/beep/mp3" "github.com/faiface/beep/speaker" "github.com/getlantern/systray" ) var ( audioBuffer *beep.Buffer ) func main() { initAudio() systray.Run(onReady, onExit) } // ... (other functions will go here)
Lassen Sie uns jede Funktion aufschlüsseln:
func main() { initAudio() systray.Run(onReady, onExit) }
Hier startet unsere App. Es bewirkt zwei wichtige Dinge:
func initAudio() { execPath, err := os.Executable() if err != nil { log.Fatal(err) } resourcesPath := filepath.Join(filepath.Dir(execPath), "..", "Resources") chimeFile := filepath.Join(resourcesPath, "chime.mp3") f, err := os.Open(chimeFile) if err != nil { log.Fatal(err) } defer f.Close() streamer, format, err := mp3.Decode(f) if err != nil { log.Fatal(err) } defer streamer.Close() audioBuffer = beep.NewBuffer(format) audioBuffer.Append(streamer) err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10)) if err != nil { log.Fatal(err) } }
Diese Funktion richtet unser Audio ein:
Wenn etwas schief geht (z. B. wenn die Sounddatei nicht gefunden wird), wird der Fehler protokolliert und beendet.
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() { <-mQuit.ClickedCh systray.Quit() }() go runClock() }
Diese Funktion richtet unser Menüleistensymbol ein:
func onExit() { // Cleanup tasks go here }
Diese Funktion wird aufgerufen, wenn die App beendet wird. Wir machen hier nichts, aber Sie können bei Bedarf Bereinigungsaufgaben hinzufügen.
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t := <-ticker.C: if t.Minute() == 0 || t.Minute() == 15 || t.Minute() == 30 || t.Minute() == 45 { go chime(t) } } } }
Das ist das „Herz“ unserer Uhr:
func chime(t time.Time) { hour := t.Hour() minute := t.Minute() var chimeTimes int if minute == 0 { chimeTimes = hour % 12 if chimeTimes == 0 { chimeTimes = 12 } } else { chimeTimes = 1 } for i := 0; i < chimeTimes; i++ { streamer := audioBuffer.Streamer(0, audioBuffer.Len()) speaker.Play(streamer) time.Sleep(time.Duration(audioBuffer.Len()) * time.Second / time.Duration(audioBuffer.Format().SampleRate)) if i < chimeTimes-1 { time.Sleep(500 * time.Millisecond) // Wait between chimes } } }
Diese Funktion spielt unsere Glockenspiele:
func getIcon() []byte { execPath, err := os.Executable() if err != nil { log.Fatal(err) } iconPath := filepath.Join(filepath.Dir(execPath), "..", "Resources", "icon.png") // Read the icon file icon, err := os.ReadFile(iconPath) if err != nil { log.Fatal(err) } return icon }
Diese Funktion erhält unser Menüleistensymbol:
Um unsere App zu einem echten macOS-Bürger zu machen, müssen wir ein Anwendungspaket erstellen. Dazu gehört das Erstellen einer Info.plist-Datei:
<?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>CFBundleExecutable</key> <string>CityHallClock</string> <key>CFBundleIconFile</key> <string>AppIcon</string> <key>CFBundleIdentifier</key> <string>com.yourcompany.cityhallclock</string> <key>CFBundleName</key> <string>City Hall Clock</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleVersion</key> <string>1</string> <key>LSMinimumSystemVersion</key> <string>10.12</string> <key>LSUIElement</key> <true/> <key>NSHighResolutionCapable</key> <true/> </dict> </plist>
Speichern Sie dies als Info.plist in Ihrem Projektverzeichnis.
Wir brauchen zwei Symbole:
Lassen Sie uns ein Build-Skript (build.sh) erstellen:
#!/bin/bash # Build the Go application go build -o CityHallClock # Create the app bundle structure mkdir -p CityHallClock.app/Contents/MacOS mkdir -p CityHallClock.app/Contents/Resources # Move the executable to the app bundle mv CityHallClock CityHallClock.app/Contents/MacOS/ # Copy the Info.plist cp Info.plist CityHallClock.app/Contents/ # Copy the chime sound to Resources cp chime.mp3 CityHallClock.app/Contents/Resources/ # Copy the menu bar icon cp icon.png CityHallClock.app/Contents/Resources/ # Copy the application icon cp AppIcon.icns CityHallClock.app/Contents/Resources/ echo "Application bundle created: CityHallClock.app"
Machen Sie es mit chmod +x build.sh ausführbar und führen Sie es dann mit ./build.sh aus.
Und da haben Sie es! Sie haben eine voll funktionsfähige City Hall Clock-App für macOS erstellt. Sie haben Folgendes gelernt:
Erläutern Sie dies gerne weiter. Fügen Sie möglicherweise Präferenzen für benutzerdefinierte Glockenspiele oder unterschiedliche Glockenspielintervalle hinzu. Der Himmel ist die Grenze!
Den vollständigen Quellcode finden Sie hier https://github.com/rezmoss/citychime
Viel Spaß beim Programmieren und viel Spaß mit Ihrer neuen Uhr!
Das obige ist der detaillierte Inhalt vonErstellen einer Rathausuhr-App für macOS: Eine umfassende Anleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!