2015-01-07 3 views
10

Я смотрел образец Apple Lister (for Apple Watch, iOS, and OS X). Образец выполняет тест для IOS, и OS X:Макрос препроцессора для Apple Watch?

#import <TargetConditionals.h> 

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) 

@import ListerKit; 

#elif TARGET_OS_MAC 

@import ListerKitOSX; 

#endif 

Однако, нет никакого теста на TARGET_OS_WATCH или аналогичный. Для watch оглавлению в TargetConditionals.h не обеспечивает ни одного хита:

$ cat /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 
    /SDKs/iPhoneOS7.1.sdk/usr/include/TargetConditionals.h | grep -i watch 
$ 

От TargetConditionals.h, я знаю, что есть:

 These conditionals specify in which Operating System the generated code will 
    run. The MAC/WIN32/UNIX conditionals are mutually exclusive. The EMBEDDED/IPHONE 
    conditionals are variants of TARGET_OS_MAC. 

     TARGET_OS_MAC   - Generate code will run under Mac OS 
     TARGET_OS_WIN32   - Generate code will run under 32-bit Windows 
     TARGET_OS_UNIX   - Generate code will run under some non Mac OS X unix 
     TARGET_OS_EMBEDDED  - Generate code will run under an embedded OS variant 
            of TARGET_OS_MAC 
     TARGET_OS_IPHONE  - Generate code will run under iPhone OS which 
            is a variant of TARGET_OS_MAC. 
    TARGET_IPHONE_SIMULATOR  - Generate code for running under iPhone Simulator

Вопрос: Есть ли препроцессор для часов Apple?


Я мечение с , но я не уверен, что это правильный OS на этот вопрос.

Список, указанный ниже, был составлен на iPhone TargetConditionals.h. Simulator и OS X подобны (они просто разные биты установлены в 1):

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_EMBEDDED   1 
#define TARGET_OS_IPHONE   1 
#define TARGET_IPHONE_SIMULATOR  0 

Вопросы: Есть ли использовать часы TARGET_OS_EMBEDDED? Имеются ли часы omitTARGET_OS_IPHONE?

ответ

19

Начиная с watchOS 2.0, вы можете запустить собственный код на часах, так что это более актуальный вопрос.

Я использую первую раннюю бета-версию watchOS 2, поэтому это может измениться, но прямо сейчас, TARGET_OS_WATCH установлено на 1 на watchOS.

(Кроме того, будьте осторожны: TARGET_OS_IPHONE также устанавливается в 1 по watchOS, хотя TARGET_OS_IOS 0.)

2

С помощью текущего WatchKit SDK весь код в приложении «Часы» работает на телефоне, в котором он соединен, поэтому нет смысла, чтобы ваш препроцессор столкнулся с кодом, который будет запускаться на Watch, и, следовательно, макрос, чтобы сказать, что делать, когда это произойдет. Код цели ListerWatch образца, с которым вы связались, будет работать как расширение на iPhone и поговорить с его часовым интерфейсом через WatchKit.

+0

Возможно, у вас есть общий менеджерский класс, который вызывает [UIApplication sharedApplication], который запрещен на часах, но вы знаете, никогда не будет вызывается или может быть перезаписана с помощью этого макроса. – ge0rges

8

Условное ограничение расширения WatchKit или приложения отсутствует. Но вы можете создать свои собственные условные условные обозначения, которые вы используете таким же образом.

Если вы посмотрите в разделе «Настройки сборки» для любой цели, появится раздел «Другие флаги C». Добавьте запись для цели WatchKit. Если вы добавите что-то вроде -DMY_WATCHKIT_FLAG=1, вы можете сделать #if MY_WATCHKIT_FLAG в коде.

Сделайте свой собственный флаг, ну, обычай. Не исключено, что Apple может добавить флаг в будущем, назвав что-то вроде TARGET_WATCH_APP или что-то еще. Используйте префикс в имени флага, чтобы сделать его конкретным для вас.

+1

Во время вопроса я должен был принять этот ответ. Я не уверен, почему я этого не сделал. Но по мере того как судьба имела его, Apple добавила 'TARGET_OS_WATCH'. Извините за задержку. – jww

12

Вы можете найти все виды целевых условными в TargetConditionals.h (Cmd + Shift + O и тип TargetConditionals.h).

В этом списке вы можете найти список, подобный этому, и многие другие полезные определения. В настоящее время он содержит TARGET_OS_WATCH с WatchOS 2.Для WatchOS 1 было невозможно запустить пользовательский код на часах, поэтому он не понадобился тогда, поскольку все работало на самом телефоне.

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_IPHONE   1 
#define TARGET_OS_IOS    0 
#define TARGET_OS_WATCH    1 
#define TARGET_OS_TV    0 
#define TARGET_OS_SIMULATOR   0 
#define TARGET_OS_EMBEDDED   1 

Swift Добавление

#if os(watchOS) 
    [Watch code] 
#else 
    [Code for iOS, appleTV, or any else clause] 
#endif 

Некоторые другие действительные значения: IOS, OSX, tvOS

Небольшое пояснение по этому поводу и более http://nshipster.com/swift-system-version-checking/

В нижней части этого документа https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_15#Build Конфигурации Под сенью ction 'Build Configurations' вы можете найти (надеюсь) обновленный список со всеми этими значениями, которые в настоящее время доступны