¿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.
Nuestra aplicación City Hall Clock:
Primero lo primero, configuremos nuestro proyecto:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
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:
func main() { initAudio() systray.Run(onReady, onExit) }
Aquí es donde comienza nuestra aplicación. Hace dos cosas importantes:
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:
Si algo sale mal (como no encontrar el archivo de sonido), registrará el error y cerrará.
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ú:
- Establece el ícono (usando getIcon()).
- Establece el título y la información sobre herramientas.
- Agrega una opción "Salir" al menú.
- Empieza a escuchar cuando se hace clic en la opción "Salir".
- 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:
- Crea un ticker que "marca" cada minuto.
- En un bucle infinito, comprueba la hora cada minuto.
- 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; iEsta función reproduce nuestras campanas:
- 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).
- 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ú:
- Encuentra dónde se está ejecutando nuestra aplicación.
- Ubica el archivo de icono en el directorio de Recursos.
- 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:
CFBundleExecutable CityHallClock CFBundleIconFile AppIcon CFBundleIdentifier com.yourcompany.cityhallclock CFBundleName City Hall Clock CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion 10.12 LSUIElement NSHighResolutionCapable Guarde esto como Info.plist en el directorio de su proyecto.
Agregar iconos personalizados
Necesitamos dos íconos:
- Icono de la barra de menú: crea un PNG de 22x22 píxeles llamado icon.png.
- 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:
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!
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