هل أنت مستعد لإنشاء تطبيق City Hall Clock الرائع لجهاز Mac الخاص بك؟ عظيم! سنقوم بإنشاء تطبيق موجود في شريط القائمة لديك، ويصدر صوتًا كل 15 دقيقة، بل ويحسب الساعات. دعنا نقسمها خطوة بخطوة، وسأشرح كل جزء من الكود حتى تتمكن من فهم ما يحدث.
سيقوم تطبيق City Hall Clock الخاص بنا بما يلي:
أول الأشياء أولاً، لنقم بإعداد مشروعنا:
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) }
هذا هو المكان الذي يبدأ فيه تطبيقنا. يفعل شيئين مهمين:
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() {تقوم هذه الوظيفة بإعداد رمز شريط القوائم الخاص بنا:
- تعيين الرمز (باستخدام getIcon()).
- تعيين العنوان وتلميح الأداة.
- إضافة خيار "إنهاء" إلى القائمة.
- يبدأ الاستماع عند النقر على خيار "إنهاء".
- يبدأ تشغيل ساعتنا (في روتين منفصل حتى لا يتم حظره).
4. وظيفة onExit ().
func onExit() { // Cleanup tasks go here }يتم استدعاء هذه الوظيفة عند إنهاء التطبيق. نحن لا نفعل أي شيء هنا، ولكن يمكنك إضافة مهام التنظيف إذا لزم الأمر.
5. وظيفة runClock()
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t :=هذا هو "قلب" ساعتنا:
- يقوم بإنشاء شريط "يضع علامة" كل دقيقة.
- في حلقة لا نهائية، يتم التحقق من الوقت كل دقيقة.
- إذا كان ذلك في أعلى الساعة أو الربع الماضي، فإنه يطلق الرنين.
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تعمل هذه الوظيفة على تشغيل أجراسنا:
- يعرف عدد مرات الرنين (مرة واحدة لمدة ربع ساعة، أو عدد الساعة في أعلى الساعة).
- ثم يتم تشغيل صوت الرنين عدة مرات، مع توقف قصير بين الدقات.
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 }تحصل هذه الوظيفة على أيقونة شريط القوائم لدينا:
- يكتشف مكان تشغيل تطبيقنا.
- يحدد موقع ملف الرمز في دليل الموارد.
- يقرأ ملف الأيقونة ويعيد محتوياته.
إنشاء حزمة تطبيقات macOS
لجعل تطبيقنا مواطنًا مناسبًا لنظام التشغيل macOS، نحتاج إلى إنشاء حزمة تطبيق. يتضمن ذلك إنشاء ملف Info.plist:
CFBundleExecutable CityHallClock CFBundleIconFile AppIcon CFBundleIdentifier com.yourcompany.cityhallclock CFBundleName City Hall Clock CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion 10.12 LSUIElement NSHighResolutionCapable احفظ هذا كـ Info.plist في دليل المشروع الخاص بك.
إضافة أيقونات مخصصة
نحتاج إلى رمزين:
- رمز شريط القائمة: قم بإنشاء ملف PNG مقاس 22 × 22 بكسل باسم icon.png.
- رمز التطبيق: إنشاء ملف .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. لقد تعلمت عن:
لا تتردد في التوسع في هذا الشأن. ربما يمكنك إضافة تفضيلات للأجراس المخصصة أو فترات الرنين المختلفة. السماء هي الحد!
يمكنك العثور على كود المصدر الكامل هنا https://github.com/rezmoss/citychime
سعيد بالبرمجة، واستمتع بساعتك الجديدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3