获取Xcode 5来警告新的API调用

有一个Xcode 4.x的方法:

#define __AVAILABILITY_TOO_NEW __attribute__((deprecated("TOO NEW!"))) __attribute__((weak_import)) #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 #undef __AVAILABILITY_INTERNAL__IPHONE_6_0 #define __AVAILABILITY_INTERNAL__IPHONE_6_0 __AVAILABILITY_TOO_NEW #endif 

但是由于iOS 7 SDK Availabilitymacros已经改变,现在不再有效了,现在有更多的差异和选项:

iOS 6 SDK的AvailabilityInternal.h:

 #define __AVAILABILITY_INTERNAL__IPHONE_6_0 __attribute__((availability(ios,introduced=6.0))) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_0 __attribute__((availability(ios,introduced=6.0,deprecated=6.0))) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_1 __attribute__((availability(ios,introduced=6.0,deprecated=6.1))) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_NA __attribute__((availability(ios,introduced=6.0))) 

iOS 7 SDK:

 #define __AVAILABILITY_INTERNAL__IPHONE_6_0 __attribute__((availability(ios,introduced=6.0))) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_0 __attribute__((availability(ios,introduced=6.0,deprecated=6.0))) #if __has_feature(attribute_availability_with_message) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_0_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=6.0,message=_msg))) #else #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_0_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=6.0))) #endif #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_1 __attribute__((availability(ios,introduced=6.0,deprecated=6.1))) #if __has_feature(attribute_availability_with_message) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_1_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=6.1,message=_msg))) #else #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_6_1_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=6.1))) #endif #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_7_0 __attribute__((availability(ios,introduced=6.0,deprecated=7.0))) #if __has_feature(attribute_availability_with_message) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_7_0_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=7.0,message=_msg))) #else #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_7_0_MSG(_msg) __attribute__((availability(ios,introduced=6.0,deprecated=7.0))) #endif #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_NA __attribute__((availability(ios,introduced=6.0))) #define __AVAILABILITY_INTERNAL__IPHONE_6_0_DEP__IPHONE_NA_MSG(_msg) __attribute__((availability(ios,introduced=6.0))) 

难道Xcode 5具有attribute_availability_with_messagefunction,所以旧的macros重定义不再使用?

而且打印比“太新”更酷! 消息与所有新的介绍/不赞成的信息。

编辑:

iOS 7 SDK中的大多数定义从__OSX_AVAILABLE_STARTING(_ios) / __AVAILABILITY_INTERNAL##_ios移至NS_AVAILABLE_IOS(_ios) / CF_AVAILABLE_IOS(_ios) ,因此重新定义:

 #undef NS_AVAILABLE_IOS #define NS_AVAILABLE_IOS(_ios) __attribute__((availability(ios,__NSi_##_ios))) __attribute__((deprecated("TOO NEW!"))) 

应该pipe用。 实际上,它确实是因为Xcode 5自动完成将方法显示为已弃用。

但是,build立不会触发任何警告,尽pipe有GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS选项…

我发现了一些关于这个话题的其他信息。 这将重新定义一个不同的macros( NS_AVAILABLE_IOS )。 也许它会比我们的工作好一点

(来源http://www.albertopasca.it/whiletrue/2013/05/xcode-warn-api-classes-methods/

 #import <availability.h> #import <foundation/NSObjCRuntime.h> #if( 1 ) #define APICHECK_2_0( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_2_1( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_2_2( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_3_0( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_3_1( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_3_2( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_4_0( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_4_1( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_4_2( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_4_3( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_5_0( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #define APICHECK_5_1( _ios ) __attribute__((deprecated("UNAVAILABLE PRIOR TO 5.1"))) #define APICHECK_6_0( _ios ) __attribute__((deprecated("UNAVAILABLE PRIOR TO 6.0"))) #define APICHECK_6_1( _ios ) __attribute__((deprecated("UNAVAILABLE PRIOR TO 6.1"))) #define APICHECK_NA( _ios ) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_##_ios) #undef NS_AVAILABLE_IOS #define NS_AVAILABLE_IOS(_ios) APICHECK_ ## _ios( _ios ) #undef NS_AVAILABLE #define NS_AVAILABLE(_mac, _ios) APICHECK_ ## _ios( _ios ) #endif 

您可以像以前一样使用条件( #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0等)。 请注意,我没有testing过,因为我的机器上没有Xcode 5。 如果要将警告转换为错误,可以使用__attribute__((unavailable("UNAVAILABLE PRIOR TO 6.1")))__attribute__((unavailable("UNAVAILABLE PRIOR TO 6.1")))

你也可以尝试使用这个程序,虽然它是付费的。 http://www.deploymateapp.com/

在Xcode 5中,您应该能够使用/调整我的答案中的代码到https://stackoverflow.com/a/19567669/473067 。 它可能与模块的使用不兼容,但我没有检查。

我在这里发布了一个总结: http : //iphone.m20.nl/wp/2013/10/xcode-5-and-flagging-weak-linked-unavailable-symbols-from-a-newer-sdk/

使用这里描述的方法: https : //stackoverflow.com/a/8919108/480467

此外,为了在XCode 5下正常工作,还需要重新定义NS_AVAILABLE和NS_DEPRECATEDmacros,因为CFAvailability.h区分了支持attribute_availability_with_messagefunction的编译器。

看到我的回应在这里: https : //stackoverflow.com/a/19704587/480467

从Xcode 5.0开始,不可能通过重新定义macros来从新的API调用中获取警告。

重新定义macros会自动完成和预处理预览(助理编辑器>预处理),但不会触发警告,尽pipe使用deprecateunavailable关键字。

Xcode 5.0.1+不会显示警告,所以现在可以重新定义__AVAILABILITY_INTERNAL__IPHONE_X_XNS_AVAILABLE_IOS如问题和@borrrden答案中所述。

代码可以作为要点和图书馆使用 :

 #define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_5_0 #ifndef __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED #define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_OS_VERSION_MIN_REQUIRED #endif #if __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED < __IPHONE_OS_VERSION_MIN_REQUIRED #error You cannot ask for a soft max version which is less than the deployment target #endif #define __NBU_AVAILABILITY_STARTING(version) __attribute__((deprecated("Only available in iOS " version "+"))) __attribute__((weak_import)) #if __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED < __IPHONE_2_0 #undef __AVAILABILITY_INTERNAL__IPHONE_2_0 #define __AVAILABILITY_INTERNAL__IPHONE_2_0 __NBU_AVAILABILITY_STARTING("2.0") #define __NBU_APICHECK_2_0(_ios) __NBU_AVAILABILITY_STARTING("2.0") #else #define __NBU_APICHECK_2_0(_ios) CF_AVAILABLE_IOS(_ios) #endif #if __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED < __IPHONE_2_1 #undef __AVAILABILITY_INTERNAL__IPHONE_2_1 #define __AVAILABILITY_INTERNAL__IPHONE_2_1 __NBU_AVAILABILITY_STARTING("2.1") #define __NBU_APICHECK_2_1(_ios) __NBU_AVAILABILITY_STARTING("2.1") #else #define __NBU_APICHECK_2_1(_ios) CF_AVAILABLE_IOS(_ios) #endif //... #if __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED < __IPHONE_7_0 #undef __AVAILABILITY_INTERNAL__IPHONE_7_0 #define __AVAILABILITY_INTERNAL__IPHONE_7_0 __NBU_AVAILABILITY_STARTING("7.0") #define __NBU_APICHECK_7_0(_ios) __NBU_AVAILABILITY_STARTING("7.0") #else #define __NBU_APICHECK_7_0(_ios) CF_AVAILABLE_IOS(_ios) #endif #undef NS_AVAILABLE_IOS #define NS_AVAILABLE_IOS(_ios) __NBU_APICHECK_##_ios( _ios ) #undef __OSX_AVAILABLE_BUT_DEPRECATED #define __OSX_AVAILABLE_BUT_DEPRECATED(_osx, _osxDep, _ios, _iosDep) __AVAILABILITY_INTERNAL##_ios #undef __OSX_AVAILABLE_BUT_DEPRECATED_MSG #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osx, _osxDep, _ios, _iosDep, _msg) __AVAILABILITY_INTERNAL##_ios