如何在Objective-C中限制API仅在特定iOS版本区间可用?
在Objective-C中限制API仅在特定iOS版本区间可用
问题背景
在Swift中,我们可以通过@available属性精准限定API的可用版本区间,例如让某个方法仅在iOS 14.0到14.9.9之间可用:
@available(iOS, introduced: 14.0, obsoleted: 15.0) @objc extension Foo { func foo(_ arg: AnyObject) {} }
但在Objective-C中,尝试使用API_AVAILABLE(ios(14.0)) API_UNAVAILABLE(ios(15.0))的写法无效,因为API_UNAVAILABLE不支持带具体版本号的参数。如何在Objective-C中实现相同的版本区间限制逻辑?
解决方案
在Objective-C中,要实现这种精确版本区间的API限制,需要结合API_AVAILABLE和API_DEPRECATED_WITH_REPLACEMENT(或API_DEPRECATED)宏,具体写法如下:
方法一:使用API_DEPRECATED_WITH_REPLACEMENT
@interface Foo (FooCategory) - (void)foo:(id)someId API_AVAILABLE(ios(14.0)) API_DEPRECATED_WITH_REPLACEMENT("", ios(15.0), ios(15.0)); @end
- 第一个参数为替代API的名称,无替代方案时可传入空字符串
- 后两个参数分别指定开始废弃的版本和完全移除的版本,均设为15.0即可模拟Swift中
obsoleted:15.0的效果:API在iOS 14.0及以上可用,iOS 15.0及之后被废弃且不可用
方法二:简化使用API_DEPRECATED
如果不需要指定替代API,可直接使用API_DEPRECATED宏:
@interface Foo (FooCategory) - (void)foo:(id)someId API_AVAILABLE(ios(14.0)) API_DEPRECATED("", ios(15.0), ios(15.0)); @end
设置完成后,当代码在iOS 15.0及以上版本中调用该方法时,编译器会触发废弃警告;若开启严格废弃检查,将直接报错,以此实现版本区间的限制。
内容的提问来源于stack exchange,提问作者Dmitry Katkevich
相关产品推荐
相关产品推荐

