iOS13不同版本Xcode的编译适配

5,407 阅读1分钟

背景

新的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可以看到

__IPHONE_OS_VERSION_MAX_ALLOWED

它是当前支持的最高版本,相当于前面Xcode中选择的Base SDK 参照:曾静的博客-iOS开发之多系统版本兼容

2.#define __IPHONE_13_0 130000

#define __IPHONE_13_0 130000这在这里usr/include/AvailabilityInternal.h

__IPHONE_13_0    130000

到此就解决了不同版本Xcode的编译适配问题。


END