إصدار وبناء تطبيق iOS بلغة Swift: حل بسيط

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية الحصول على إصدار التطبيق ورقم البناء في Swift: شرح كامل مع الكود

\n\n

هل تساءلت يومًا لماذا في App Store يمكن تسمية نفس التطبيق "MyMessenger 3.2"، بينما في إعدادات الهاتف يظهر "3.2.1 (45)"؟ أو لماذا يطلب منك المطورون إرسال "رقم البناء" عندما تبلغ عن خطأ؟ الإجابة بسيطة: داخل كل تطبيق iOS يعيش رقمان مخفيان — إصدار التطبيق ورقم البناء. واليوم سوف نتعلم كيفية استخراجهما باستخدام Swift. هذا أحد أكثر الأسئلة شيوعًا على Stack Overflow (عشرات الآلاف من المشاهدات!)، وليس من دون سبب: معرفة هذين السطرين من الكود يمكن أن يوفر لك ساعات من التصحيح وأعصاب المستخدمين.

\n\n

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

\n\n

ما هو الإصدار (version) ورقم البناء (build number)؟

\n\n

قبل كتابة الكود، دعنا نفهم المصطلحات. في Xcode، في ملف Info.plist (أو في إعدادات المشروع)، يوجد مفتاحان:

\n\n
    \n
  • CFBundleShortVersionString — هذا ما يراه المستخدم في App Store وفي إعدادات التطبيق. عادةً ما يبدو مثل "1.0"، "2.3.1" إلخ. هذا هو إصدار المستخدم.
  • \n
  • CFBundleVersion — هذا هو رقم البناء الداخلي. يمكن أن يكون أي شيء: "42"، "20240315"، "1.0.0.123". هذا هو إصدار المطور، الذي يساعد في التمييز بين البناءات المختلفة لنفس الإصدار.
  • \n
\n\n

لماذا الفصل؟ تخيل أنك أصدرت الإصدار 1.0، لكنك وجدت خطأً حرجًا. تقوم بإصلاحه دون تغيير الوظائف — لا يزال هذا هو الإصدار 1.0 للمستخدم، لكنك تزيد رقم البناء (على سبيل المثال، من 1 إلى 2). بهذه الطريقة، لا تربك المستخدم، وفي Crashlytics ترى أي بناء هو الذي تعطل.

\n\n

أبسط طريقة: Bundle.main

\n\n

توفر Apple وصولاً سهلاً إلى هذه البيانات من خلال كائن Bundle.main. إليك الحل الكلاسيكي الذي ستجده على Stack Overflow:

\n\n
import UIKit\n\nclass ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // الحصول على إصدار التطبيق\n        let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"\n        // الحصول على رقم البناء\n        let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"\n        \n        print("إصدار التطبيق: \\(appVersion)")\n        print("رقم البناء: \\(buildNumber)")\n        \n        // مثال على الاستخدام في واجهة المستخدم\n        versionLabel.text = "الإصدار \\(appVersion) (بناء \\(buildNumber))"\n    }\n}\n
\n\n

كل شيء عبقري بسيط. لكن دعنا نشرح كل سطر:

\n
    \n
  • Bundle.main — هو الحزمة الرئيسية لتطبيقك (ملف .app).
  • \n
  • infoDictionary — قاموس يقرأ Info.plist.
  • \n
  • نستخدم التحويل الاختياري عبر as? String والعامل ?? في حالة عدم وجود المفتاح (على الرغم من أن هذا غير مرجح).
  • \n
\n\n

نهج متقدم: القراءة من ProcessInfo

\n\n

هل تريد أن تبدو محترفًا؟ استخدم ProcessInfo. هذه الفئة تعرف عن النظام أكثر من مجرد plist. لكن بالنسبة لإصدار التطبيق، لا يقدم أي شيء جديد، لكنه يمكن أن يظهر نظام التشغيل. ومع ذلك، هناك خدعة واحدة: إذا قمت بتغليف الحصول على البيانات في extension، يصبح الكود أنظف وأكثر قابلية لإعادة الاستخدام.

\n\n
import Foundation\n\nextension Bundle {\n    var appVersion: String {\n        return infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"\n    }\n    \n    var buildNumber: String {\n        return infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"\n    }\n    \n    var fullVersion: String {\n        return "الإصدار \\(appVersion) (بناء                

المدونات

توصيات الكتب