13

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または類似のテストはありません。watchinを grep して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、私はあることを知っています:

    これらの条件は、生成されたコードがどのオペレーティング システムで使用されるかを指定します。
    走る。MAC/WIN32/UNIX 条件は相互に排他的です。埋め込み/iPhone
    条件は TARGET_OS_MAC のバリアントです。

        TARGET_OS_MAC - 生成コードは Mac OS で実行されます
        TARGET_OS_WIN32 - 生成コードは 32 ビット Windows で実行されます
        TARGET_OS_UNIX - 生成コードは一部の非 Mac OS X UNIX で実行されます
        TARGET_OS_EMBEDDED - 生成コードは組み込み OS バリアントで実行されます
                                  TARGET_OS_MAC の
        TARGET_OS_IPHONE - 生成コードは iPhone OS で実行されます。
                                  TARGET_OS_MAC のバリアントです。
    TARGET_IPHONE_SIMULATOR - iPhone シミュレーターで実行するためのコードを生成します

質問: Apple の時計用のプリプロセッサはありますか?


でタグ付けしていますが、この質問に対する正しい OS かどうかはわかりません。

以下のリストは、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していますか?

4

4 に答える 4

24

TargetConditionals.h (cmd + shift + o とタイプ TargetConditionals.h) で、すべての種類のターゲット条件を見つけることができます。

このリストには、このようなリストと、さらに多くの便利な定義があります。現在、WatchOS 2 以降、TARGET_OS_WATCH が含まれています。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 Configurations の下セクション「ビルド構成」で、現在利用可能なこれらすべての値を含む(うまくいけば)最新のリストを見つけることができます

于 2016-03-30T13:47:25.813 に答える
20

watchOS 2.0 の時点で、時計でネイティブ コードを実行できるため、これはより関連性の高い質問です。

私は watchOS 2 の最初の早期ベータ版を使用しているため、これは変更される可能性がありますが、現在TARGET_OS_WATCHは watchOS で 1 に設定されています。

(また、注意してください:TARGET_OS_IPHONETARGET_OS_IOS0 ですが、watchOS では 1 に設定されます。)

于 2015-06-11T18:47:50.137 に答える
8

WatchKit またはアプリ拡張機能のターゲット条件はありません。ただし、同じ方法で使用する独自のターゲットごとの条件を作成できます。

ターゲットの「ビルド設定」セクションを見ると、「その他の C フラグ」というセクションがあります。WatchKit ターゲットのエントリを追加します。のようなものを追加すると、コード-DMY_WATCHKIT_FLAG=1で実行でき#if MY_WATCHKIT_FLAGます。

カスタム フラグを作成します。Apple が将来、フラグのようなものを追加する可能性はありTARGET_WATCH_APPます。フラグ名にプレフィックスを使用して、特定のものにします。

于 2015-01-07T03:55:04.223 に答える
2

現在の WatchKit SDK では、Watch アプリケーションのすべてのコードは、ペアになっている電話で実行されるため、プリプロセッサが Watch で実行されるコードに遭遇するポイントがなく、したがって、マクロが通知するのはあまり役に立ちません。そうなったらどうするか。リンク先のサンプルの ListerWatch ターゲットのコードは、iPhone で拡張機能として実行され、WatchKit を介してウォッチ UI と通信します。

于 2015-01-07T02:12:06.750 に答える