"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء تطبيق City Hall Clock لنظام التشغيل macOS: دليل شامل

إنشاء تطبيق City Hall Clock لنظام التشغيل macOS: دليل شامل

تم النشر بتاريخ 2024-11-03
تصفح:150

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

هل أنت مستعد لإنشاء تطبيق City Hall Clock الرائع لجهاز Mac الخاص بك؟ عظيم! سنقوم بإنشاء تطبيق موجود في شريط القائمة لديك، ويصدر صوتًا كل 15 دقيقة، بل ويحسب الساعات. دعنا نقسمها خطوة بخطوة، وسأشرح كل جزء من الكود حتى تتمكن من فهم ما يحدث.

نظرة عامة على المشروع

سيقوم تطبيق City Hall Clock الخاص بنا بما يلي:

  • عرض رمز الساعة في شريط قوائم 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. الوظيفة الرئيسية ().

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

هذا هو المكان الذي يبدأ فيه تطبيقنا. يفعل شيئين مهمين:

  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() {
        



تقوم هذه الوظيفة بإعداد رمز شريط القوائم الخاص بنا:

  1. تعيين الرمز (باستخدام getIcon()).
  2. تعيين العنوان وتلميح الأداة.
  3. إضافة خيار "إنهاء" إلى القائمة.
  4. يبدأ الاستماع عند النقر على خيار "إنهاء".
  5. يبدأ تشغيل ساعتنا (في روتين منفصل حتى لا يتم حظره).

4. وظيفة onExit ().

func onExit() {
    // Cleanup tasks go here
}

يتم استدعاء هذه الوظيفة عند إنهاء التطبيق. نحن لا نفعل أي شيء هنا، ولكن يمكنك إضافة مهام التنظيف إذا لزم الأمر.

5. وظيفة runClock()

func runClock() {
    ticker := time.NewTicker(time.Minute)
    defer ticker.Stop()

    for {
        select {
        case t := 



هذا هو "قلب" ساعتنا:

  1. يقوم بإنشاء شريط "يضع علامة" كل دقيقة.
  2. في حلقة لا نهائية، يتم التحقق من الوقت كل دقيقة.
  3. إذا كان ذلك في أعلى الساعة أو الربع الماضي، فإنه يطلق الرنين.

6. وظيفة الرنين ().

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 



تعمل هذه الوظيفة على تشغيل أجراسنا:

  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. يحدد موقع ملف الرمز في دليل الموارد.
  3. يقرأ ملف الأيقونة ويعيد محتوياته.

إنشاء حزمة تطبيقات macOS

لجعل تطبيقنا مواطنًا مناسبًا لنظام التشغيل macOS، نحتاج إلى إنشاء حزمة تطبيق. يتضمن ذلك إنشاء ملف Info.plist:

CFBundleExecutableCityHallClockCFBundleIconFileAppIconCFBundleIdentifiercom.yourcompany.cityhallclockCFBundleNameCity Hall ClockCFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleVersion1LSMinimumSystemVersion10.12LSUIElementNSHighResolutionCapable

احفظ هذا كـ Info.plist في دليل المشروع الخاص بك.

إضافة أيقونات مخصصة

نحتاج إلى رمزين:

  1. رمز شريط القائمة: قم بإنشاء ملف PNG مقاس 22 × 22 بكسل باسم icon.png.
  2. رمز التطبيق: إنشاء ملف .icns:
    • جعل الصور بحجم 16x16 إلى 1024x1024 بكسل.
    • احفظها في AppIcon.iconset بأسماء مثل icon_16x16.png.
    • تشغيل: 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.

خاتمة

وهذا هو الحال! لقد قمت بإنشاء تطبيق City Hall Clock يعمل بكامل طاقته لنظام التشغيل macOS. لقد تعلمت عن:

  • إنشاء تطبيق شريط القوائم باستخدام Go
  • تشغيل الأصوات على فترات زمنية محددة
  • تعبئة تطبيق Go كتطبيق macOS أصلي

لا تتردد في التوسع في هذا الشأن. ربما يمكنك إضافة تفضيلات للأجراس المخصصة أو فترات الرنين المختلفة. السماء هي الحد!

يمكنك العثور على كود المصدر الكامل هنا https://github.com/rezmoss/citychime

سعيد بالبرمجة، واستمتع بساعتك الجديدة!

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/rezmoss/building-a-city-hall-clock-app-for-macos-a-comprehensive-guide-48k4?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang @163.com حذف
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3