ios - 获取 Xcode 5 以警告新的 API 调用

标签 ios objective-c api ios7 xcode5

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 可用性宏已更改,现在有更多变化和选项:

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 开发工具包:

#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_message 特性,所以不再使用旧的宏重定义?

打印比“TOO NEW!”更多的东西也很酷。包含所有新引入/弃用信息的消息。

编辑:

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!")))

应该可以。实际上它确实如此,因为 Xcode 5 自动完成将这些方法显示为已弃用。

尽管在...上具有 GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS 构建选项,但构建不会触发任何警告

最佳答案

我发现了一些关于该主题的其他信息。这将重新定义一个不同的宏 ( NS_AVAILABLE_IOS )。也许它会比

(来源 https://www.albertopasca.it/whiletrue/xcode-warn-about-new-api-classes-and-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 等)。请注意,我还没有对此进行测试,因为我的机器上还没有 Xcode 5。如果你想把警告变成错误,你可以使用 __attribute__((unavailable("UNAVAILABLE PRIOR TO 6.1")))等等

您也可以尝试使用此程序,但它是付费的。 http://www.deploymateapp.com/

关于ios - 获取 Xcode 5 以警告新的 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19111934/

相关文章:

iOS:原生 UISwitch 中的小拇指

javascript - 如何在web应用程序中动态更改ios状态栏的背景颜色

ios - 将 UIImage 从 iPhone 传递到 Apple Watch 会导致 watch 无响应

iphone - 输入粗体文本时出错 - Objective-C

api - 使用 OSGi 实现模块化 API

c# - Google Analytics 维度和指标验证

api - LinkedIn API - 我不明白他们希望如何格式化网址

ios - 如何使用 Swift 3 中的 Pod 使用 Swift 4.0 构建 xcode 9 项目?

objective-c - 相同的命令,不同的结果 setFrame : NSView

ios - 如何获得 CurrentCulture 的正确值?