背景
新的Xcode 11.0出来了,在团队里,可能喜欢尝鲜了同学会优先更新体验,调用一些iOS13才有的API,比如
@implementation UISearchBar (Ext)
- (UITextField *)getSearchTextField {
if (@available(iOS 13.0, *)) {
return self.searchTextField;
} else {
return [self valueForKey:@"_searchField"];
}
}
@end
此时,还处于Xcode ~< 13.0的同学编译是不通过的,因为他们的~<13.0 UIKit中还没有这个API。
一. 解决方案
添加编译判断
#ifndef __IPHONE_13_0
#define __IPHONE_13_0 130000
#endif
@implementation UISearchBar (Ext)
- (UITextField *)getSearchTextField {
/* #if avoid build errors*/
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
if (@available(iOS 13.0, *)) {
return self.searchTextField;
} else {
return [self valueForKey:@"_searchField"];
}
#else
return [self valueForKey:@"_searchField"];
#endif
}
@end
核心代码在这里
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
//Base SDK最高支持版本大于等于13.0
#else
#endif
二. 解析
1.__IPHONE_OS_VERSION_MAX_ALLOWED
__IPHONE_OS_VERSION_MAX_ALLOWED这个东西进到头文件usr/include/AvailabilityInternal.h可以看到
它是当前支持的最高版本,相当于前面Xcode中选择的Base SDK 参照:曾静的博客-iOS开发之多系统版本兼容
2.#define __IPHONE_13_0 130000
#define __IPHONE_13_0 130000这在这里usr/include/AvailabilityInternal.h
到此就解决了不同版本Xcode的编译适配问题。
END

