"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Construindo um aplicativo City Hall Clock para macOS: um guia completo

Construindo um aplicativo City Hall Clock para macOS: um guia completo

Publicado em 2024-11-03
Navegar:894

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

Pronto para criar um aplicativo legal do City Hall Clock para o seu Mac? Ótimo! Vamos criar um aplicativo que fica na barra de menu, toca a cada 15 minutos e até conta as horas. Vamos detalhar passo a passo e explicarei cada parte do código para que você possa entender o que está acontecendo.

Visão geral do projeto

Nosso aplicativo City Hall Clock irá:

  • Exibir um ícone de relógio na barra de menu do macOS
  • Toque a cada 15 minutos
  • Acione o número de horas no início de cada hora
  • Forneça uma opção "Sair" na barra de menu
  • Execute como um aplicativo macOS adequado sem abrir uma janela de terminal

Configurando o Projeto

Primeiro, vamos configurar nosso projeto:

  1. Crie um novo diretório:
   mkdir CityHallClock
   cd CityHallClock
  1. Inicialize um novo módulo Go:
   go mod init cityhallclock
  1. Instale as dependências necessárias:
   go get github.com/getlantern/systray
   go get github.com/faiface/beep

O Código Principal

Agora, vamos criar nosso arquivo main.go e examinar cada função:

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)

Vamos detalhar cada função:

1. Função principal()

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

É aqui que nosso aplicativo começa. Ele faz duas coisas importantes:

  1. Chama initAudio() para configurar nosso som de campainha.
  2. Executa nosso aplicativo da bandeja do sistema, informando o que fazer quando estiver pronto (onReady) e quando estiver encerrando (onExit).

2. Função 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 função configura nosso áudio:

  1. Ele descobre onde nosso aplicativo está sendo executado e localiza o arquivo de som da campainha.
  2. Abre o arquivo MP3 e o decodifica.
  3. Cria um buffer de áudio com o som da campainha.
  4. Inicializa o alto-falante de áudio.

Se algo der errado (como não encontrar o arquivo de som), ele registrará o erro e será encerrado.

3. Função 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 função configura nosso ícone na barra de menu:

  1. Define o ícone (usando getIcon()).
  2. Define o título e a dica de ferramenta.
  3. Adiciona uma opção "Sair" ao menu.
  4. Começa a ouvir quando a opção "Sair" é clicada.
  5. Começa a executar nosso relógio (em uma goroutine separada para não bloquear).

4. Função onExit()

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

Esta função é chamada quando o aplicativo é encerrado. Não estamos fazendo nada aqui, mas você pode adicionar tarefas de limpeza, se necessário.

5. Função runClock()

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

    for {
        select {
        case t := 



Este é o "coração" do nosso relógio:

  1. Ele cria um ticker que "marca" a cada minuto.
  2. Em um loop infinito, ele verifica a hora a cada minuto.
  3. Se for no final da hora ou quinze minutos, ele aciona o sinal sonoro.

6. Função chime()

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 função toca nossos sinos:

  1. Ele calcula quantas vezes tocar (uma vez por quarto de hora ou o número da hora no início da hora).
  2. Em seguida, ele reproduz o som do sino várias vezes, com uma breve pausa entre os sinos.

7. Função 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 função obtém nosso ícone da barra de menu:

  1. Ele descobre onde nosso aplicativo está sendo executado.
  2. Localiza o arquivo de ícone no diretório Recursos.
  3. Lê o arquivo de ícone e retorna seu conteúdo.

Criando o pacote de aplicativos macOS

Para tornar nosso aplicativo um cidadão macOS adequado, precisamos criar um pacote de aplicativos. Isso envolve a criação de um arquivo Info.plist:

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

Salve como Info.plist no diretório do seu projeto.

Adicionando ícones personalizados

Precisamos de dois ícones:

  1. Ícone da barra de menu: crie um PNG de 22x22 pixels chamado icon.png.
  2. Ícone do aplicativo: Crie um arquivo .icns:
    • Faça imagens com tamanhos de 16x16 a 1024x1024 pixels.
    • Salve-os em AppIcon.iconset com nomes como icon_16x16.png.
    • Execute: iconutil -c icns AppIcon.iconset

Construção e Embalagem

Vamos criar um script de construção (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"

Torne-o executável com chmod x build.sh e, em seguida, execute-o com ./build.sh.

Conclusão

E aí está! Você criou um aplicativo City Hall Clock totalmente funcional para macOS. Você aprendeu sobre:

  • Criando um aplicativo de barra de menu com Go
  • Reproduzindo sons em intervalos específicos
  • Empacotando um aplicativo Go como um aplicativo macOS nativo

Sinta-se à vontade para expandir isso. Talvez adicione preferências para toques personalizados ou diferentes intervalos de toque. O céu é o limite!

Você pode encontrar o código-fonte completo aqui https://github.com/rezmoss/citychime

Boa programação e aproveite seu novo relógio!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/rezmoss/building-a-city-hall-clock-app-for-macos-a-comprehensive-guide-48k4?1 Se houver alguma violação, entre em contato com study_golang @163.com excluir
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3