«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание приложения «Часы мэрии» для macOS: подробное руководство

Создание приложения «Часы мэрии» для macOS: подробное руководство

Опубликовано 3 ноября 2024 г.
Просматривать:509

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

Готовы создать классное приложение «Часы мэрии» для своего Mac? Большой! Мы собираемся создать приложение, которое будет размещаться в строке меню, звонить каждые 15 минут и даже отсчитывать часы. Давайте разберем это шаг за шагом, и я объясню каждую часть кода, чтобы вы могли понять, что происходит.

Обзор проекта

Наше приложение «Часы мэрии» будет:

  • Отображение значка часов в строке меню macOS
  • Звонок каждые 15 минут
  • Назовите количество часов в начале каждого часа
  • Добавьте опцию «Выход» в строке меню
  • Запускать как обычное приложение macOS, не открывая окно терминала

Настройка проекта

Во-первых, давайте настроим наш проект:

  1. Создайте новый каталог:
   mkdir CityHallClock
   cd CityHallClock
  1. Инициализируйте новый модуль Go:
   go mod init cityhallclock
  1. Установите необходимые зависимости:
   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)

Давайте разберем каждую функцию:

1. Функция main()

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

Здесь начинается наше приложение. Он делает две важные вещи:

  1. Вызывает initAudio() для настройки звука звонка.
  2. Запускает наше приложение в системной панели, сообщая ему, что делать, когда оно будет готово (onReady) и когда оно завершится (onExit).

2. Функция 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)
    }
}

Эта функция настраивает наш звук:

  1. Он определяет, где запущено наше приложение, и находит звуковой файл звонка.
  2. Открывает файл MP3 и декодирует его.
  3. Создает аудиобуфер со звуком звонка.
  4. Инициализирует аудиодинамик.

Если что-то пойдет не так (например, звуковой файл не найден), программа зарегистрирует ошибку и завершит работу.

3. Функция 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() {
        



Эта функция устанавливает значок в строке меню:

  1. Устанавливает значок (с помощью getIcon()).
  2. Задает заголовок и всплывающую подсказку.
  3. Добавляет в меню пункт «Выход».
  4. Начинает прослушивание при нажатии кнопки «Выход».
  5. Запускает наши часы (в отдельной горутине, чтобы они не блокировались).

4. Функция onExit()

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

Эта функция вызывается при выходе из приложения. Мы здесь ничего не делаем, но при необходимости вы можете добавить задачи по очистке.

5. Функция runClock()

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

    for {
        select {
        case t := 



Это «сердце» наших часов:

  1. Он создает тикер, который «тикает» каждую минуту.
  2. В бесконечном цикле время проверяется каждую минуту.
  3. Если наступил конец часа или четверти, включается звуковой сигнал.

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 



Эта функция воспроизводит наши колокольчики:

  1. Он определяет, сколько раз следует звонить (один раз для четверти часа или номер часа в начале часа).
  2. Затем он воспроизводит звуковой сигнал несколько раз с небольшой паузой между звуковыми сигналами.

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
}

Эта функция получает значок нашей строки меню:

  1. Он находит, где запущено наше приложение.
  2. Находит файл значка в каталоге «Ресурсы».
  3. Читает файл значка и возвращает его содержимое.

Создание пакета приложений 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 в каталоге вашего проекта.

Добавление пользовательских значков

Нам нужны две иконки:

  1. Значок в строке меню: создайте PNG-изображение размером 22x22 пикселя с именем icon.png.
  2. Значок приложения: создайте файл .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. Вы узнали о:

  • Создание приложения в виде строки меню с помощью Go
  • Воспроизведение звуков через определенные промежутки времени
  • Упаковка приложения Go как собственного приложения для macOS

Расширьте эту тему. Возможно, добавьте настройки для пользовательских звонков или разных интервалов звонков. Нет предела!

Полный исходный код можно найти здесь https://github.com/rezmoss/citychime

Удачного программирования и наслаждайтесь новыми часами!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rezmoss/building-a-city-hall-lock-app-for-macos-a-comprehensive-guide-48k4?1 Если есть какие-либо нарушения, свяжитесь с Study_golang. @163.com удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3