Heim >Backend-Entwicklung >Golang >Erstellen einer Rathausuhr-App für macOS: Eine umfassende Anleitung

Erstellen einer Rathausuhr-App für macOS: Eine umfassende Anleitung

WBOY
WBOYOriginal
2024-09-07 06:34:051052Durchsuche

Building a City Hall Clock App for macOS: A Comprehensive Guide

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.

Projektübersicht

Unsere Rathausuhr-App wird:

  • Ein Uhrsymbol in der macOS-Menüleiste anzeigen
  • Klingeln alle 15 Minuten
  • Erläuten Sie zu jeder vollen Stunde die Anzahl der Stunden
  • Stellen Sie in der Menüleiste die Option „Beenden“ bereit
  • Als richtige macOS-Anwendung ausführen, ohne ein Terminalfenster zu öffnen

Einrichten des Projekts

Das Wichtigste zuerst: Lasst uns unser Projekt einrichten:

  1. Erstellen Sie ein neues Verzeichnis:
   mkdir CityHallClock
   cd CityHallClock
  1. Initialisieren Sie ein neues Go-Modul:
   go mod init cityhallclock
  1. Installieren Sie die erforderlichen Abhängigkeiten:
   go get github.com/getlantern/systray
   go get github.com/faiface/beep

Der Hauptcode

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:

1. main() Funktion

func main() {
    initAudio()
    systray.Run(onReady, onExit)
}

Hier startet unsere App. Es bewirkt zwei wichtige Dinge:

  1. Ruft initAudio() auf, um unseren Glockenton einzurichten.
  2. Führt unsere Systray-App aus und teilt ihr mit, was zu tun ist, wenn sie bereit ist (onReady) und wenn sie beendet wird (onExit).

2. initAudio()-Funktion

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:

  1. Es findet heraus, wo unsere App ausgeführt wird, und findet die Glockenspiel-Sounddatei.
  2. Öffnet die MP3-Datei und dekodiert sie.
  3. Erstellt einen Audiopuffer mit dem Glockenton.
  4. Initialisiert den Audiolautsprecher.

Wenn etwas schief geht (z. B. wenn die Sounddatei nicht gefunden wird), wird der Fehler protokolliert und beendet.

3. onReady()-Funktion

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:

  1. Legt das Symbol fest (mit getIcon()).
  2. Legt den Titel und den Tooltip fest.
  3. Fügt dem Menü die Option „Beenden“ hinzu.
  4. Beginnt zu warten, wenn auf die Option „Beenden“ geklickt wird.
  5. Startet den Betrieb unserer Uhr (in einer separaten Goroutine, damit sie nicht blockiert).

4. onExit()-Funktion

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.

5. runClock()-Funktion

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:

  1. Es wird ein Ticker erstellt, der jede Minute „tickt“.
  2. In einer Endlosschleife prüft es jede Minute die Zeit.
  3. Wenn es die späteste Stunde oder Viertel nach ist, löst es den Glockenschlag aus.

6. chime() Funktion

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:

  1. Es ermittelt, wie oft geläutet werden soll (einmal für Viertelstunden oder die Zahl der Stunden am Anfang der vollen Stunde).
  2. Dann wird der Glockenton so oft abgespielt, mit einer kurzen Pause zwischen den Glockenschlägen.

7. getIcon()-Funktion

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:

  1. Es findet heraus, wo unsere App ausgeführt wird.
  2. Sucht die Symboldatei im Ressourcenverzeichnis.
  3. Liest die Symboldatei und gibt ihren Inhalt zurück.

Erstellen des macOS-Anwendungspakets

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.

Hinzufügen benutzerdefinierter Symbole

Wir brauchen zwei Symbole:

  1. Menüleistensymbol: Erstellen Sie ein 22x22 Pixel großes PNG mit dem Namen icon.png.
  2. App-Symbol: Erstellen Sie eine .icns-Datei:
    • Erstellen Sie Bilder mit einer Größe von 16 x 16 bis 1024 x 1024 Pixel.
    • Speichern Sie sie in AppIcon.iconset mit Namen wie icon_16x16.png.
    • Führen Sie Folgendes aus: iconutil -c icns AppIcon.iconset

Bauen und Verpacken

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.

Abschluss

Und da haben Sie es! Sie haben eine voll funktionsfähige City Hall Clock-App für macOS erstellt. Sie haben Folgendes gelernt:

  • Erstellen einer Menüleisten-App mit Go
  • Abspielen von Tönen in bestimmten Abständen
  • Eine Go-Anwendung als native macOS-App verpacken

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn