Готовы создать классное приложение «Часы мэрии» для своего Mac? Большой! Мы собираемся создать приложение, которое будет размещаться в строке меню, звонить каждые 15 минут и даже отсчитывать часы. Давайте разберем это шаг за шагом, и я объясню каждую часть кода, чтобы вы могли понять, что происходит.
Наше приложение «Часы мэрии» будет:
Во-первых, давайте настроим наш проект:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Теперь давайте создадим файл main.go и рассмотрим каждую функцию:
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)
Давайте разберем каждую функцию:
func main() { initAudio() systray.Run(onReady, onExit) }
Здесь начинается наше приложение. Он делает две важные вещи:
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) } }
Эта функция настраивает наш звук:
Если что-то пойдет не так (например, звуковой файл не найден), программа зарегистрирует ошибку и завершит работу.
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() {Эта функция устанавливает значок в строке меню:
- Устанавливает значок (с помощью getIcon()).
- Задает заголовок и всплывающую подсказку.
- Добавляет в меню пункт «Выход».
- Начинает прослушивание при нажатии кнопки «Выход».
- Запускает наши часы (в отдельной горутине, чтобы они не блокировались).
4. Функция onExit()
func onExit() { // Cleanup tasks go here }Эта функция вызывается при выходе из приложения. Мы здесь ничего не делаем, но при необходимости вы можете добавить задачи по очистке.
5. Функция runClock()
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t :=Это «сердце» наших часов:
- Он создает тикер, который «тикает» каждую минуту.
- В бесконечном цикле время проверяется каждую минуту.
- Если наступил конец часа или четверти, включается звуковой сигнал.
6. Функция звонка()
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Эта функция воспроизводит наши колокольчики:
- Он определяет, сколько раз следует звонить (один раз для четверти часа или номер часа в начале часа).
- Затем он воспроизводит звуковой сигнал несколько раз с небольшой паузой между звуковыми сигналами.
7. Функция 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 }Эта функция получает значок нашей строки меню:
- Он находит, где запущено наше приложение.
- Находит файл значка в каталоге «Ресурсы».
- Читает файл значка и возвращает его содержимое.
Создание пакета приложений macOS
Чтобы сделать наше приложение подходящим для macOS, нам нужно создать пакет приложения. Для этого необходимо создать файл 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 Сохраните это как Info.plist в каталоге вашего проекта.
Добавление пользовательских значков
Нам нужны две иконки:
- Значок в строке меню: создайте PNG-изображение размером 22x22 пикселя с именем icon.png.
- Значок приложения: создайте файл .icns:
- Создавайте изображения размером от 16x16 до 1024x1024 пикселей.
- Сохраните их в AppIcon.iconset с именами типа icon_16x16.png.
- Выполните: iconutil -c icns AppIcon.iconset
Строительство и упаковка
Давайте создадим скрипт сборки (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"Сделайте его исполняемым с помощью chmod x build.sh, затем запустите его с помощью ./build.sh.
Заключение
И вот оно! Вы создали полнофункциональное приложение «Часы мэрии» для macOS. Вы узнали о:
Расширьте эту тему. Возможно, добавьте настройки для пользовательских звонков или разных интервалов звонков. Нет предела!
Полный исходный код можно найти здесь https://github.com/rezmoss/citychime
Удачного программирования и наслаждайтесь новыми часами!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3