"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > macOS용 시청 시계 앱 구축: 종합 가이드

macOS용 시청 시계 앱 구축: 종합 가이드

2024-11-03에 게시됨
검색:893

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. 1분마다 "틱"하는 티커를 생성합니다.
  2. 무한 루프 속에서 1분마다 시간을 확인합니다.
  3. 한 시간 또는 15분의 1이 지나면 차임벨이 울립니다.

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. 차임벨을 몇 번 울릴지 파악합니다(15분에 한 번 또는 정각에 해당하는 시간).
  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 파일 생성이 포함됩니다:

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

이를 프로젝트 디렉토리에 Info.plist로 저장하세요.

사용자 정의 아이콘 추가

두 개의 아이콘이 필요합니다:

  1. 메뉴 표시줄 아이콘: icon.png라는 22x22 픽셀 PNG를 만듭니다.
  2. 앱 아이콘: .icns 파일을 만듭니다.
    • 이미지 크기를 16x16~1024x1024픽셀로 만듭니다.
    • icon_16x16.png와 같은 이름으로 AppIcon.iconset에 저장합니다.
    • 실행: 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-clock-app-for-macos-a-comprehensive-guide-48k4?1에서 복제됩니다.1 침해가 있는 경우, Study_golang에 문의하세요. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3