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) }
ここからアプリが始まります。これは 2 つの重要なことを行います:
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() { <-mQuit.ClickedCh systray.Quit() }() go runClock() }
この関数はメニュー バー アイコンを設定します:
func onExit() { // Cleanup tasks go here }
この関数は、アプリの終了時に呼び出されます。ここでは何もしていませんが、必要に応じてクリーンアップ タスクを追加できます。
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) } } } }
これは私たちの時計の「心臓」です:
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 } } }
この関数はチャイムを鳴らします:
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 市民にするには、アプリケーション バンドルを作成する必要があります。これには、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 つのアイコンが必要です:
ビルド スクリプト (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
コーディングを楽しんで、新しい時計をお楽しみください!
以上がmacOS 用の市庁舎時計アプリの構築: 総合ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。