Макрос препроцессора для Apple Watch?

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

#import <TargetConditionals.h>

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)

@import ListerKit;

#elif TARGET_OS_MAC

@import ListerKitOSX;

#endif

Однако для TARGET_OS_WATCH или подобного не существует теста. Grepping для 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?


Я помечен ios, но я не уверен, что правильная ОС для этого вопроса.

Список ниже был составлен с iPhone TargetConditionals.h. Симулятор и 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? Опускают ли часы TARGET_OS_IPHONE?

Ответ 1

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

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

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

Ответ 2

Вы можете найти все условные условные обозначения в TargetConditionals.h(cmd + shift + o и type 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 

Быстрое добавление

#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 Конфигурации В разделе "Конфигурации сборки" вы можете найти (надеюсь) обновленный список со всеми этими значениями, которые в настоящее время доступны

Ответ 3

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

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

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

Ответ 4

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