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

Membina Apl Jam Dewan Bandaraya untuk macOS: Panduan Komprehensif

WBOY
WBOYasal
2024-09-07 06:34:05923semak imbas

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