"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Creación de una aplicación de reloj del ayuntamiento para macOS: una guía completa

Creación de una aplicación de reloj del ayuntamiento para macOS: una guía completa

Publicado el 2024-11-03
Navegar:321

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

¿Estás listo para crear una genial aplicación City Hall Clock para tu Mac? ¡Excelente! Vamos a crear una aplicación que se ubica en su barra de menú, suena cada 15 minutos e incluso cuenta las horas. Analicémoslo paso a paso y explicaré cada parte del código para que puedas entender lo que está pasando.

Descripción general del proyecto

Nuestra aplicación City Hall Clock:

  • Mostrar un icono de reloj en la barra de menú de macOS
  • Timbre cada 15 minutos
  • Suena el número de horas al principio de cada hora
  • Proporcionar una opción "Salir" en la barra de menú
  • Ejecutar como una aplicación macOS adecuada sin abrir una ventana de terminal

Configurando el proyecto

Primero lo primero, configuremos nuestro proyecto:

  1. Crear un nuevo directorio:
   mkdir CityHallClock
   cd CityHallClock
  1. Inicializar un nuevo módulo Go:
   go mod init cityhallclock
  1. Instalar las dependencias requeridas:
   go get github.com/getlantern/systray
   go get github.com/faiface/beep

El código principal

Ahora, creemos nuestro archivo main.go y revisemos cada función:

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)

Desglosemos cada función:

1. Función principal ()

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

Aquí es donde comienza nuestra aplicación. Hace dos cosas importantes:

  1. Llama a initAudio() para configurar nuestro sonido de timbre.
  2. Ejecuta nuestra aplicación de bandeja del sistema y le indica qué hacer cuando esté lista (onReady) y cuando salga (onExit).

2. Función initAudio()

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

Esta función configura nuestro audio:

  1. Encuentra dónde se está ejecutando nuestra aplicación y localiza el archivo de sonido del timbre.
  2. Abre el archivo MP3 y lo decodifica.
  3. Crea un búfer de audio con el sonido del timbre.
  4. Inicializa el altavoz de audio.

Si algo sale mal (como no encontrar el archivo de sonido), registrará el error y cerrará.

3. Función onReady()

func onReady() {
    systray.SetIcon(getIcon())
    systray.SetTitle("City Hall Clock")
    systray.SetTooltip("City Hall Clock")

    mQuit := systray.AddMenuItem("Quit", "Quit the app")

    go func() {
        



Esta función configura nuestro ícono de barra de menú:

  1. Establece el ícono (usando getIcon()).
  2. Establece el título y la información sobre herramientas.
  3. Agrega una opción "Salir" al menú.
  4. Empieza a escuchar cuando se hace clic en la opción "Salir".
  5. Empieza a ejecutar nuestro reloj (en una rutina separada para que no se bloquee).

4. Función onExit()

func onExit() {
    // Cleanup tasks go here
}

Esta función se llama cuando la aplicación se cierra. No vamos a hacer nada aquí, pero puedes agregar tareas de limpieza si es necesario.

5. Función runClock()

func runClock() {
    ticker := time.NewTicker(time.Minute)
    defer ticker.Stop()

    for {
        select {
        case t := 



Este es el "corazón" de nuestro reloj:

  1. Crea un ticker que "marca" cada minuto.
  2. En un bucle infinito, comprueba la hora cada minuto.
  3. Si es el final de la hora o un cuarto, activa el timbre.

6. Función de timbre ()

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 



Esta función reproduce nuestras campanas:

  1. Calcula cuántas veces hay que sonar (una vez para los cuartos de hora, o el número de la hora al final de la hora).
  2. Luego reproduce el sonido del timbre tantas veces, con una breve pausa entre timbres.

7. Función getIcon()

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
}

Esta función obtiene nuestro ícono de la barra de menú:

  1. Encuentra dónde se está ejecutando nuestra aplicación.
  2. Ubica el archivo de icono en el directorio de Recursos.
  3. Lee el archivo de icono y devuelve su contenido.

Creación del paquete de aplicaciones macOS

Para que nuestra aplicación sea un ciudadano adecuado de macOS, necesitamos crear un paquete de aplicaciones. Esto implica crear un archivo Info.plist:

CFBundleExecutableCityHallClockCFBundleIconFileAppIconCFBundleIdentifiercom.yourcompany.cityhallclockCFBundleNameCity Hall ClockCFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleVersion1LSMinimumSystemVersion10.12LSUIElementNSHighResolutionCapable

Guarde esto como Info.plist en el directorio de su proyecto.

Agregar iconos personalizados

Necesitamos dos íconos:

  1. Icono de la barra de menú: crea un PNG de 22x22 píxeles llamado icon.png.
  2. Icono de aplicación: crear un archivo .icns:
    • Crea imágenes con un tamaño de 16x16 a 1024x1024 píxeles.
    • Guárdalos en AppIcon.iconset con nombres como icon_16x16.png.
    • Ejecutar: iconutil -c icns AppIcon.iconset

Construcción y embalaje

Creemos un script de compilación (build.sh):

#!/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"

Hazlo ejecutable con chmod x build.sh, luego ejecútalo con ./build.sh.

Conclusión

¡Y ahí lo tienes! Ha creado una aplicación City Hall Clock completamente funcional para macOS. Has aprendido sobre:

  • Creando una aplicación de barra de menú con Go
  • Reproducir sonidos a intervalos específicos
  • Empaquetar una aplicación Go como una aplicación nativa de macOS

Siéntete libre de ampliar esto. Tal vez agregue preferencias para timbres personalizados o diferentes intervalos de timbre. ¡El cielo es el límite!

Puedes encontrar el código fuente completo aquí https://github.com/rezmoss/citychime

¡Feliz codificación y disfruta de tu nuevo reloj!

Declaración de liberación Este artículo se reproduce en: https://dev.to/rezmoss/building-a-city-hall-clock-app-for-macos-a-comprehensive-guide-48k4?1 Si hay alguna infracción, comuníquese con Study_golang @163.com eliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3