سؤال

أنا أكتب بعض شبه المحمولة مدونة و تريد أن تكون قادرة على الكشف عن عندما أكون تجميع للحصول على اي فون.لذلك أريد شيئا مثل #ifdef IPHONE_SDK....

ويفترض كسكودي يعرف شيئا, ولكن لا أستطيع أن أرى أي شيء تحت خصائص المشروع و جوجل لا يساعد كثيرا.

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

المحلول

إنه في SDK مستندات تحت عنوان "ترجمة التعليمات البرمجية المصدر مشروط"

ذات الصلة التعاريف TARGET_OS_IPHONE (وهو مستنكر TARGET_IPHONE_SIMULATOR) التي تم تعريفها في /usr/وتشمل/TargetConditionals.ح ضمن إطار الرقابة الداخلية.في الإصدارات السابقة من toolchain, كان عليك أن تكتب:

#include "TargetConditionals.h"

ولكن هذا لم يعد من الضروري على الحالية (كسكودي 6/iOS8) toolchain.

لذا, فعلى سبيل المثال, إذا كنت تريد فقط تجميع كتلة من التعليمات البرمجية إذا كنت بناء الجهاز ، ثم عليك أن تفعل

#if !(TARGET_OS_SIMULATOR)
...
#endif

نصائح أخرى

أن ننظر إلى كل تعريف وحدات الماكرو ، هذا إضافة إلى "الآخر" ج "الأعلام" من بناء التكوين:

-g3 -save-temps -dD

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

grep define main.mi 

عند الانتهاء من ذلك ، لا تنسى لإزالة هذه الخيارات من بناء الإعداد.

الإجابة على هذا السؤال ليست صحيحة تماما.السؤال من منصة الأجهزة مقابل محاكاة متعامد.

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

هنا هو ASCII البياني الشرطية.أسماء لا معنى له لأسباب تاريخية:

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC ينطبق على جميع منصات أبل.


TARGET_OS_OSX صحيح فقط بالنسبة ماك

TARGET_OS_IPHONE ينطبق على دائرة الرقابة الداخلية ، watchOS ، tvOS (الأجهزة المحاكاة)


TARGET_OS_IOS صحيح فقط لدائرة الرقابة الداخلية (الأجهزة المحاكاة)

TARGET_OS_WATCH صحيح فقط بالنسبة watchOS (الأجهزة المحاكاة)

TARGET_OS_TV صحيح فقط بالنسبة tvOS (الأجهزة المحاكاة)


TARGET_OS_EMBEDDED صحيح فقط على دائرة الرقابة الداخلية/watchOS/tvOS الأجهزة

TARGET_OS_SIMULATOR ينطبق فقط على جهاز محاكاة.


أنا أيضا ملاحظة أنه يمكنك conditionalize الإعدادات في xcconfig الملفات عن طريق منصة:

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top