获取Xcode 5以警告新的API调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取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可用性宏已经改变,现在有更多的差异和选项:
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_message
功能,因此不再使用旧的宏重新定义吗?
打印超过“太新了!”也很酷。包含所有新引入/弃用信息的消息。
编辑:
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/
在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_DEPRECATED宏,因为CFAvailability.h区分支持attribute_availability_with_message功能的编译器。
请参阅我的回复:https://stackoverflow.com/a/19704587/480467
从Xcode 5.0开始,通过重新定义宏不可能从新的API调用中获得警告。
重新定义宏确实会显示在自动完成和预处理预览(助理编辑器>预处理)中,但不会触发警告,尽管使用deprecate
或unavailable
关键字。
Xcode 5.0.1+确实显示警告,因此__AVAILABILITY_INTERNAL__IPHONE_X_X
和NS_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
以上是关于获取Xcode 5以警告新的API调用的主要内容,如果未能解决你的问题,请参考以下文章
Xcode8:"subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0" 的警告(代码片段