كيف يمكنني تحديد بتشغيل إصدار نظام التشغيل Mac OS X برمجيا؟

StackOverflow https://stackoverflow.com/questions/157759

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي البرنامج الذي يحتاج إلى تتصرف بشكل مختلف قليلا على النمر من على ليوبارد. لا أحد يعرف من دعوة النظام الذي سوف اسمحوا لي أن تحدد بدقة أي إصدار من نظام التشغيل Mac OS X وأنا على التوالي. لقد وجدت عددا من تعريفات الماكرو لتحديد نظام التشغيل للجهاز بناء، ولكن لا شيء جيد حقا لتحديد نظام التشغيل للجهاز تشغيل.

وشكرا، جو

هل كانت مفيدة؟

المحلول

انظر هذه المادة هنا

ولكن باختصار، إذا كنت تستخدم الكربون، استخدم دعوة الجشطالت ()، وإذا كنت تستخدم الكاكاو، هناك ثابت يسمى NSAppKitVersionNumber التي يمكنك التحقق ببساطة ضد.

تحرير : لماك OSX 10.8 أو أعلى، لا تستخدم الجشطالت () بعد الآن. انظر هذه الإجابة لمزيد من التفاصيل: <لأ href = "https://stackoverflow.com/questions/11072804/mac-os-x-10-8-replacement-for-gestalt-for-testing-os-version-at- وقت التشغيل "> كيف يمكنني تحديد إصدار OS في وقت التشغيل في OS X أو دائرة الرقابة الداخلية (دون استخدام الجشطالت)؟

نصائح أخرى

هل يمكن أن تحقق فقط لوجود قدرة؟ على سبيل المثال:

if (NSClassFromString(@"NSKeyedArchiver") != Nil)

أو

if ([arrayController respondsToSelector: @selector(selectedIndexes)])

وثم أنت تعلم أن نظام التشغيل يفعل ما تحتاج أن تفعله، وليس تلك المجموعة تسويق المنتجات أبل أعطاه عدد معين؛ -)

ووAPI هو من خلال إدارة الجشطالت.

وانظر " تحديد إصدار نظام التشغيل " في الموقع CocoaDev.

في محطة:

system_profiler SPSoftwareDataType

ويعطي:

Software:

    System Software Overview:

      System Version: Mac OS X 10.5.5 (9F33)
      Kernel Version: Darwin 9.5.0
      Boot Volume: Main
      Boot Mode: Normal
      Computer Name: phoenix
      User Name: Douglas F Shearer (dougal)
      Time since boot: 2 days 16:55

وأو:

sw_vers

ويعطي:

ProductName:    Mac OS X
ProductVersion: 10.5.5
BuildVersion:   9F33

هل نسخة OS حقا ما تريد؟ قد يكون هناك شيء أكثر ملاءمة لاختبار، مثل وجود، أو رقم إصدار، إطار معين.

وضمن البرنامج يمكنك استخدام الجشطالت. هنا هو رمز أستخدمه لبرنامجي للحصول على إصدار نظام التشغيل.

long version = 0;
OSStatus rc0 = Gestalt(gestaltSystemVersion, &version);
if((rc0 == 0) && (version >= 0x1039)) {      
    // will work with version 10.3.9
    // works best with version 10.4.9
    return; // version is good
}
if(rc0) {
    printf("gestalt rc=%i\n", (int)rc0);
} else {
    printf("gestalt version=%08x\n", version);
}

وrespondsToSelector: شبه المؤكد هو أفضل مما كنت الحفاظ على جدول ما تقوم به نظرا النشرات ولا تنفذ.

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

وتشغيل هذا في سطر الأوامر:

system_profiler SPSoftwareDataType | grep Mac
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top