ホームページ  >  記事  >  バックエンド開発  >  macOS 用の市庁舎時計アプリの構築: 総合ガイド

macOS 用の市庁舎時計アプリの構築: 総合ガイド

WBOY
WBOYオリジナル
2024-09-07 06:34:051020ブラウズ

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)
}

ここからアプリが始まります。これは 2 つの重要なことを行います:

  1. initAudio() を呼び出してチャイム音を設定します。
  2. systray アプリを実行し、準備ができたとき (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. 正時または 15 分過ぎになると、チャイムが鳴ります。

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. チャイムを鳴らす回数を計算します (40 分に 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. Resources ディレクトリでアイコン ファイルを見つけます。
  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 として保存します。

カスタムアイコンの追加

2 つのアイコンが必要です:

  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

コーディングを楽しんで、新しい時計をお楽しみください!

以上がmacOS 用の市庁舎時計アプリの構築: 総合ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。