Swift على أنظمة iOS وmacOS القديمة: هل يعمل الكود على OS X 10.9 و iOS 7؟

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

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

ابدأ الدورة

Swift على الأنظمة القديمة: الخرافات والواقع

\n\n

تخيل الموقف: لقد كتبت تطبيقًا رائعًا بلغة Swift، وهو يعمل بشكل ممتاز على جهاز iPhone الخاص بك الذي يعمل بنظام iOS 16. ولكن يأتي مستخدم يمتلك جهازًا "قديمًا" يعمل بنظام iOS 7 ويشتكي من أن التطبيق يتعطل. أو أنك تقوم بتطوير أداة لنظام Mac، والعميل يستخدم OS X 10.9 Mavericks. هل هذا الألم مألوف؟ دعنا نحدد مرة واحدة وإلى الأبد ما إذا كانت تطبيقات Swift تعمل على الإصدارات القديمة من أنظمة تشغيل Apple.

\n\n

هذا السؤال هو موضوع شائع جدًا على Stack Overflow (أكثر من 10,000 مشاهدة). والإجابة عليه ليست واضحة كما نتمنى. في هذه المقالة، لن نقدم نظرية جافة فحسب، بل سنعرض أمثلة حقيقية على الكود، ونشرح كيفية عمل Swift runtime، ونقدم قائمة تحقق للتحقق من التوافق.

\n\n

إجابة مختصرة: نعم، ولكن مع تحفظات

\n\n

إذا كنت تريد إجابة فورية — تطبيقات Swift يمكن أن تعمل على OS X 10.9 و iOS 7، ولكن فقط إذا كنت تستخدم Swift 5.5 والإصدارات الأحدث. الإصدارات الأقدم من Swift (1.x–4.x) لا تدعم هذه الأنظمة فعليًا بسبب خصائص runtime. يبدو هذا غريبًا؟ دعنا نفهم الأمر بالترتيب.

\n\n

كيف يعمل Swift على الأنظمة القديمة بشكل عام؟

\n\n

السر يكمن في استقرار ABI (واجهة التطبيق الثنائية). قبل Swift 5.0، كان كل تطبيق يحمل معه نسخة من المكتبة القياسية لـ Swift. مما أدى إلى:

\n
    \n
  • زيادة حجم التطبيق بمقدار 5–10 ميجابايت
  • \n
  • ارتباط runtime بشكل صارم بإصدار Swift الذي تم تجميع التطبيق به
  • \n
  • عدم وجود دعم مدمج لـ Swift في الأنظمة القديمة
  • \n
\n\n

بدءًا من Swift 5.0 (Xcode 10.2)، أصبح ABI مستقرًا. هذا يعني أن المكتبة القياسية لـ Swift أصبحت مدمجة مباشرة في iOS و macOS و tvOS و watchOS. ولكن هناك فارق بسيط: إنها مدمجة فقط في iOS 12.4+ و macOS 10.14.4+. بالنسبة للأنظمة الأقدم (iOS 7, OS X 10.9)، لا يزال يتعين عليك حمل runtime معك — وهذا ممكن!

\n\n

متى أصبح هذا ممكنًا؟

\n\n

بدءًا من Swift 5.5 (Xcode 13)، أضافت Apple دعمًا لأهداف النشر القديمة. الآن يمكنك تجميع تطبيق مع IPHONEOS_DEPLOYMENT_TARGET = 7.0 أو MACOSX_DEPLOYMENT_TARGET = 10.9، وسيعمل.

\n\n

إليك كيف يبدو ذلك في كود إعداد المشروع:

\n\n
// مثال على إعداد deployment target في Swift Package Manager\n// Package.swift\nlet package = Package(\n    name: "MyLegacyApp",\n    platforms: [\n        .iOS(.v7),      // iOS 7 والإصدارات الأحدث\n        .macOS(.v10_9)  // OS X 10.9 والإصدارات الأحدث\n    ],\n    dependencies: [],\n    targets: [\n        .target(\n            name: "MyLegacyApp",\n            swiftSettings: [\n                .unsafeFlags(["-target", "x86_64-apple-macosx10.9"])\n            ]\n        )\n    ]\n)
\n\n

مثال عملي: تطبيق لنظام iOS 7 بلغة Swift

\n\n

دعنا نكتب مثالًا بسيطًا سيعمل على iOS 7. لاحظ: لا يمكننا استخدام واجهات برمجة التطبيقات الحديثة (على سبيل المثال، UIAlertController ظهر فقط في iOS 8).

\n\n
import UIKit\n\n// كلاس متوافق مع iOS 7\nclass LegacyViewController: UIViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // استخدام UIAlertView القديم (يعمل على iOS 7)\n        let alert = UIAlertView()\n        alert.title = "مرحبًا من Swift!"\n        alert.message = "هذا التطبيق يعمل على iOS 7"\n        alert.addButton(withTitle: "موافق")\n        alert.show()\n        \n        // بديل: التحقق من إصدار iOS\n        if #available(iOS 8.0, *) {\n            // كود حديث لنظام iOS 8+\n            let modernAlert = UIAlertController(\n                title: "تنبيه حديث",\n                message: "يعمل فقط على iOS 8+",\n                preferredStyle: .alert\n            )\n            modernAlert.addAction(UIAlertAction(title: "موافق", style: .default))\n            present(mode                

المدونات

توصيات الكتب