Rumah pembangunan bahagian belakang Golang Membina Apl Jam Dewan Bandaraya untuk macOS: Panduan Komprehensif

Membina Apl Jam Dewan Bandaraya untuk macOS: Panduan Komprehensif

Sep 07, 2024 am 06:34 AM

Building a City Hall Clock App for macOS: A Comprehensive Guide

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.

Gambaran Keseluruhan Projek

Apl Jam Dewan Bandaraya kami akan:

  • Paparkan ikon jam dalam bar menu macOS
  • Berbunyi setiap 15 minit
  • Panggilkan bilangan jam di bahagian atas setiap jam
  • Sediakan pilihan "Berhenti" dalam bar menu
  • Jalankan sebagai aplikasi macOS yang betul tanpa membuka tetingkap terminal

Menyediakan Projek

Perkara pertama dahulu, mari sediakan projek kami:

  1. Buat direktori baharu:
   mkdir CityHallClock
   cd CityHallClock
  1. Mulakan modul Go baharu:
   go mod init cityhallclock
  1. Pasang kebergantungan yang diperlukan:
   go get github.com/getlantern/systray
   go get github.com/faiface/beep

Kod Utama

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:

1. Fungsi utama().

func main() {
    initAudio()
    systray.Run(onReady, onExit)
}

Di sinilah apl kami bermula. Ia melakukan dua perkara penting:

  1. Panggil initAudio() untuk menyediakan bunyi loceng kami.
  2. Menjalankan apl systray kami, memberitahunya perkara yang perlu dilakukan apabila ia sedia (onReady) dan apabila ia berhenti (onExit).

2. Fungsi 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)
    }
}

Fungsi ini menyediakan audio kami:

  1. Ia mencari tempat apl kami berjalan dan mencari fail bunyi loceng.
  2. Membuka fail MP3 dan menyahkodnya.
  3. Mencipta penimbal audio dengan bunyi loceng.
  4. Memulakan pembesar suara audio.

Jika apa-apa berlaku (seperti tidak menjumpai fail bunyi), ia akan mencatat ralat dan berhenti.

3. Fungsi 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()
}

Fungsi ini menyediakan ikon bar menu kami:

  1. Menetapkan ikon (menggunakan getIcon()).
  2. Menetapkan tajuk dan petua alat.
  3. Menambahkan pilihan "Keluar" pada menu.
  4. Mula mendengar apabila pilihan "Berhenti" diklik.
  5. Mula menjalankan jam kami (dalam goroutine yang berasingan supaya ia tidak menyekat).

4. Fungsi onExit().

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.

5. Fungsi 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)
            }
        }
    }
}

Ini adalah "jantung" jam kami:

  1. Ia mencipta penanda yang "berdetik" setiap minit.
  2. Dalam gelung tak terhingga, ia menyemak masa setiap minit.
  3. Sekiranya pukul paling atas satu jam atau suku lewat, ia akan mencetuskan bunyi loceng.

6. Fungsi loceng().

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:

  1. Ia mengira berapa kali untuk berbunyi (sekali untuk suku jam, atau bilangan jam di bahagian atas jam itu).
  2. Ia kemudian memainkan bunyi loceng berkali-kali, dengan jeda singkat antara loceng.

7. Fungsi 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
}

Fungsi ini mendapat ikon bar menu kami:

  1. Ia mencari tempat apl kami dijalankan.
  2. Mencari fail ikon dalam direktori Sumber.
  3. Membaca fail ikon dan mengembalikan kandungannya.

Mencipta Himpunan Aplikasi macOS

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.

Menambah Ikon Tersuai

Kami memerlukan dua ikon:

  1. Ikon Bar Menu: Buat PNG 22x22 piksel bernama icon.png.
  2. Ikon Apl: Buat fail .icns:
    • Buat imej bersaiz 16x16 hingga 1024x1024 piksel.
    • Simpan mereka dalam AppIcon.iconset dengan nama seperti icon_16x16.png.
    • Jalankan: iconutil -c icns AppIcon.iconset

Bangunan dan Pembungkusan

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.

Kesimpulan

Dan begitulah! Anda telah membina apl Jam Dewan Bandaraya yang berfungsi sepenuhnya untuk macOS. Anda telah belajar tentang:

  • Membuat apl bar menu dengan Go
  • Memainkan bunyi pada selang waktu tertentu
  • Membungkus aplikasi Go sebagai apl macOS asli

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pergi antara muka: keperluan di bawah pelaksanaan yang tidak dipaksa Pergi antara muka: keperluan di bawah pelaksanaan yang tidak dipaksa Sep 09, 2025 am 11:09 AM

Walaupun antara muka GO tidak memaksa pelaksanaan pengisytiharan yang jelas, mereka masih penting dalam melaksanakan polimorfisme dan decoupling kod. Dengan menentukan satu set tandatangan kaedah, antara muka membolehkan jenis yang berbeza diproses dengan cara bersatu, membolehkan reka bentuk dan skalabiliti kod fleksibel. Artikel ini akan meneroka ciri -ciri antara muka Go secara mendalam dan menunjukkan nilai aplikasinya dalam pembangunan sebenar melalui contoh.

Bagaimana untuk menentukan fail yang terlibat dalam penyusunan semasa membina? Bagaimana untuk menentukan fail yang terlibat dalam penyusunan semasa membina? Sep 09, 2025 am 11:57 AM

Artikel ini bertujuan untuk membantu pemaju memahami bagaimana untuk menentukan fail mana yang akan disusun dan dihubungkan dalam projek GO, terutamanya jika fail khusus sistem wujud. Kami akan meneroka dua kaedah: menghuraikan output menggunakan arahan Go Build -n, dan menggunakan fungsi import pakej Go/Build. Dengan kaedah ini, anda boleh mempunyai pemahaman yang jelas tentang proses membina dan menguruskan projek anda dengan lebih baik.

Mulakan editor luaran dalam program Go dan tunggu selesai Mulakan editor luaran dalam program Go dan tunggu selesai Sep 16, 2025 pm 12:21 PM

Artikel ini menerangkan bagaimana untuk memulakan editor luaran (seperti VIM atau Nano) dalam program Go dan tunggu pengguna menutup editor sebelum program terus dilaksanakan. Dengan menetapkan cmd.stdin, cmd.stdout, dan cmd.stderr, editor boleh berinteraksi dengan terminal untuk menyelesaikan masalah kegagalan permulaan. Pada masa yang sama, contoh kod lengkap ditunjukkan dan langkah berjaga -jaga disediakan untuk membantu pemaju melaksanakan fungsi ini dengan lancar.

Selesaikan GO WebSocket EOF ERROR: Pastikan sambungan aktif Selesaikan GO WebSocket EOF ERROR: Pastikan sambungan aktif Sep 16, 2025 pm 12:15 PM

Artikel ini bertujuan untuk menyelesaikan kesilapan EOF (akhir-of-file) yang dihadapi ketika membangunkan WebSocket menggunakan GO. Kesalahan ini biasanya berlaku apabila pelayan menerima mesej klien dan sambungannya ditutup tanpa disangka -sangka, mengakibatkan mesej berikutnya tidak dapat dihantar secara normal. Artikel ini akan menganalisis punca masalah, memberikan contoh kod, dan menyediakan penyelesaian yang sepadan untuk membantu pemaju membina aplikasi WebSocket yang stabil dan boleh dipercayai.

Bagaimana anda membaca dan menulis fail di Golang? Bagaimana anda membaca dan menulis fail di Golang? Sep 21, 2025 am 01:59 AM

Goprovidessimpleandefficientfilehandlingingtheosandbufiopackages.toreadasmallfileentirely, useos.readfile, whittloadsthecontentintomemorysafelyandautomatikManageSoperations.forlargefilesorincrementalprementalprementalprementrementprementalplocessing,

Cara Membaca Konfigurasi Dari Fail di Golang Cara Membaca Konfigurasi Dari Fail di Golang Sep 18, 2025 am 05:26 AM

Gunakan pakej pengekodan/json perpustakaan standard untuk membaca fail konfigurasi JSON; 2. Gunakan perpustakaan Gopkg.in/yaml.v3 untuk membaca konfigurasi format YAML; 3. Gunakan Perpustakaan OS.Getenv atau Godotenv untuk menimpa konfigurasi fail; 4. Gunakan perpustakaan Viper untuk menyokong fungsi lanjutan seperti konfigurasi pelbagai format, pembolehubah persekitaran, tambah nilai automatik; Adalah perlu untuk menentukan struktur untuk memastikan keselamatan jenis, mengendalikan kesilapan fail dan parsing dengan betul, menggunakan medan pemetaan tag struktur dengan betul, mengelakkan laluan berkod keras, dan mengesyorkan menggunakan pembolehubah persekitaran atau penyimpanan konfigurasi yang selamat dalam persekitaran pengeluaran. Ia boleh bermula dengan JSON yang mudah dan berhijrah ke Viper apabila keperluannya kompleks.

Apakah struct struktur kosong {} yang digunakan di Golang Apakah struct struktur kosong {} yang digunakan di Golang Sep 18, 2025 am 05:47 AM

Struct {} adalah struktur tanpa medan di GO, yang menduduki bait sifar dan sering digunakan dalam senario di mana data tidak diperlukan. Ia digunakan sebagai isyarat dalam saluran, seperti penyegerakan goroutine; 2. Digunakan sebagai koleksi jenis nilai peta untuk mencapai pemeriksaan kewujudan utama dalam ingatan yang cekap; 3. Penerima kaedah tanpa stateless yang pasti, sesuai untuk suntikan pergantungan atau fungsi organisasi. Jenis ini digunakan secara meluas untuk mengekspresikan aliran kawalan dan niat yang jelas.

Apakah middleware dalam konteks pelayan web Golang? Apakah middleware dalam konteks pelayan web Golang? Sep 16, 2025 am 02:16 AM

MiddlewareinGowebserversarefunctionsthatinterceptHTTPrequestsbeforetheyreachthehandler,enablingreusablecross-cuttingfunctionality;theyworkbywrappinghandlerstoaddpre-andpost-processinglogicsuchaslogging,authentication,CORS,orerrorrecovery,andcanbechai

See all articles