2015-01-07 2 views
10

나는 애플의 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

질문 : 애플의 시계를위한 전처리가 있습니까 TargetConditionals.h에서 watch에 대한 Grepping는 더 안타를 제공하지?


나는 와 태그 합니다만, 나는이 질문에 대한 정확한 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의 초기 베타 버전을 사용 중이므로 변경 될 수 있지만 바로 지금은이 watchOS에서 1로 설정됩니다.

(또한,주의 : TARGET_OS_IPHONE도 watchOS에 1로 설정, TARGET_OS_IOS은 0입니다하지만)

당신은 TargetConditionals.h (cmd를 대상 조건문의 모든 종류를 찾을 수 있습니다
2

현재 WatchKit SDK를 사용하면 Watch 응용 프로그램의 모든 코드가 페어링 된 전화에서 실행되므로 전 처리기가 Watch에서 실행될 코드를 만날 수는 없습니다. 그것을 할 때 무엇을해야하는지 알려주는 매크로. 링크 된 샘플의 ListerWatch 타겟에있는 코드는 iPhone에서 확장 기능으로 실행되며 WatchKit을 통해 시계 UI와 대화합니다.

+0

[UIApplication sharedApplication]을 호출하는 공유 관리자 클래스가있을 수 있지만 시계에서는 금지되어 있습니다. 이 매크로를 사용하여 호출하거나 덮어 쓸 수 있습니다. – ge0rges

8

조건부 WatchKit 또는 앱 확장 대상이 없습니다. 그러나 동일한 방식으로 사용하는 고유 한 타겟 조건을 만들 수 있습니다.

대상에 대한 "빌드 설정"섹션을 보면 "기타 C 플래그"라는 섹션이 있습니다. WatchKit 대상에 대한 항목을 추가하십시오. -DMY_WATCHKIT_FLAG=1과 같은 것을 추가하면 코드에 #if MY_WATCHKIT_FLAG을 추가 할 수 있습니다.

맞춤 플래그를 사용자 지정합니다. 애플이 미래에 TARGET_WATCH_APP이나 무엇이든 등의 플래그를 추가하는 것은 불가능하지 않습니다. 플래그 이름에 접두사를 사용하여 특정 플래그를 지정하십시오.

+1

질문이있을 때, 나는이 대답을 받아 들여야했다. 왜 내가 그랬는지 모르겠습니다. 그러나 운명에 따라 애플은'TARGET_OS_WATCH'를 추가했다. 지연에 대해 유감스럽게 생각합니다. – jww

12

+ + 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 

다른 어떤 유효한 값 : 아이폰 OS, 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'현재 사용 가능한 모든 값을 가지고 (잘하면) 최신의 목록을 찾을 수 있습니다.