首頁  >  文章  >  後端開發  >  為 macOS 建立市政廳時鐘應用程式:綜合指南

為 macOS 建立市政廳時鐘應用程式:綜合指南

WBOY
WBOY原創
2024-09-07 06:34:051025瀏覽

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() {
        <-mQuit.ClickedCh
        systray.Quit()
    }()

    go runClock()
}

此函數設定我們的選單列圖示:

  1. 設定圖示(使用 getIcon())。
  2. 設定標題和工具提示。
  3. 在選單中新增「退出」選項。
  4. 點選「退出」選項時開始監聽。
  5. 開始運行我們的時鐘(在一個單獨的 goroutine 中,這樣它就不會阻塞)。

4.onExit()函數

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

當應用程式退出時呼叫此函數。我們在這裡不做任何事情,但您可以根據需要添加清理任務。

5.runClock()函數

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

    for {
        select {
        case t := <-ticker.C:
            if t.Minute() == 0 || t.Minute() == 15 || t.Minute() == 30 || t.Minute() == 45 {
                go chime(t)
            }
        }
    }
}

這是我們時鐘的「心」:

  1. 它創建了一個每分鐘「滴答」的股票代碼。
  2. 在無限循環中,它每分鐘檢查一次時間。
  3. 如果是整點或一刻鐘,則會觸發鈴聲。

6. 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 < chimeTimes; i++ {
        streamer := audioBuffer.Streamer(0, audioBuffer.Len())
        speaker.Play(streamer)
        time.Sleep(time.Duration(audioBuffer.Len()) * time.Second / time.Duration(audioBuffer.Format().SampleRate))

        if i < chimeTimes-1 {
            time.Sleep(500 * time.Millisecond)  // Wait between chimes
        }
    }
}

此功能播放我們的鈴聲:

  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 檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>CityHallClock</string>
    <key>CFBundleIconFile</key>
    <string>AppIcon</string>
    <key>CFBundleIdentifier</key>
    <string>com.yourcompany.cityhallclock</string>
    <key>CFBundleName</key>
    <string>City Hall Clock</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.12</string>
    <key>LSUIElement</key>
    <true/>
    <key>NSHighResolutionCapable</key>
    <true/>
</dict>
</plist>

將其儲存為專案目錄中的 Info.plist。

添加自訂圖標

我們需要兩個圖示:

  1. 選單列圖示:建立一個 22x22 像素的 PNG,命名為 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

快樂編碼,享受你的新時鐘!

以上是為 macOS 建立市政廳時鐘應用程式:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn