2015-01-07 19 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または同様のための試験は存在しません。 TargetConditionals.hから

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

が、私はそこにいることを知っている:

 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の腕時計のためのプリプロセッサはありTargetConditionals.hwatchのためにgrepをは何のヒットを提供していますか?


私はでタグ付けしていますが、私はそれがこの質問に対する正しい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を省略していますか?

答えて

19

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

watchOS 2の最初の初期ベータ版を使用していますので、これは変更される可能性がありますが、今すぐ012OSはwatchOSで1に設定されています。

(また、注意してください:TARGET_OS_IOSは0ですがTARGET_OS_IPHONEも、watchOS上の1に設定されている)

2

現在のWatchKit SDKでは、Watchアプリケーションのすべてのコードがペアになっている電話機で実行されるため、プリプロセッサがWatchで実行するコードに遭遇することはありませんそれができるときに何をすべきかを伝えるマクロ。リンクしたサンプルのListerWatchターゲット内のコードは、iPhone上で拡張機能として実行され、WatchKit経由でWatch UIと対話します。

+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の+シフト+ 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設定 'Build Configurations'を使って、現在利用可能なこれらすべての値を持つ(希望通りに)最新のリストを見つけることができます。

関連する問題