Bersedia untuk membina apl Jam Dewan Bandaraya yang hebat untuk Mac anda? Hebat! Kami akan mencipta apl yang terdapat dalam bar menu anda, berbunyi setiap 15 minit dan juga mengira waktu. Mari kita pecahkan langkah demi langkah dan saya akan menerangkan setiap bahagian kod supaya anda boleh memahami perkara yang sedang berlaku.
Apl Jam Dewan Bandaraya kami akan:
Perkara pertama dahulu, mari sediakan projek kami:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Sekarang, mari buat fail main.go kami dan lalui setiap fungsi:
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)
Jom pecahkan setiap fungsi:
func main() { initAudio() systray.Run(onReady, onExit) }
Di sinilah apl kami bermula. Ia melakukan dua perkara penting:
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) } }
Fungsi ini menyediakan audio kami:
Jika apa-apa berlaku (seperti tidak menjumpai fail bunyi), ia akan mencatat ralat dan berhenti.
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() }
Fungsi ini menyediakan ikon bar menu kami:
func onExit() { // Cleanup tasks go here }
Fungsi ini dipanggil apabila apl berhenti. Kami tidak melakukan apa-apa di sini, tetapi anda boleh menambah tugas pembersihan jika perlu.
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) } } } }
Ini adalah "jantung" jam kami:
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 } } }
Fungsi ini memainkan lonceng kami:
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 }
Fungsi ini mendapat ikon bar menu kami:
Untuk menjadikan apl kami warga macOS yang sesuai, kami perlu membuat himpunan aplikasi. Ini melibatkan mencipta fail 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>
Simpan ini sebagai Info.plist dalam direktori projek anda.
Kami memerlukan dua ikon:
Mari kita buat skrip binaan (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"
Jadikan ia boleh laku dengan chmod +x build.sh, kemudian jalankannya dengan ./build.sh.
Dan begitulah! Anda telah membina apl Jam Dewan Bandaraya yang berfungsi sepenuhnya untuk macOS. Anda telah belajar tentang:
Jangan ragu untuk mengembangkannya. Mungkin menambah pilihan untuk loceng tersuai atau selang loceng yang berbeza. Langit adalah hadnya!
Anda boleh mendapatkan kod sumber penuh di sini https://github.com/rezmoss/citychime
Selamat pengekodan, dan nikmati jam baharu anda!
Atas ialah kandungan terperinci Membina Apl Jam Dewan Bandaraya untuk macOS: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!