使用宏判断 SDK 版本
iOS 26 发布了开发者测试版本,Xcode 26 beta 也来了。
开发者需要提前适配新系统,同时有需要兼顾正式版本能正常编译,最好的方案就是根据当前编译的 SDK 版本进行处理,因为要在编译期进行,所以最佳方案就是使用宏:
#import <AvailabilityVersions.h>
#ifndef __IPHONE_26_0
# define __IPHONE_26_0 260000
#endif
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0)
# define IOS_UPCOMING_FEATURE_26 1
#else
# define IOS_UPCOMING_FEATURE_26 0
#endif
如果使用 Xcode 26 beta 编译,__IPHONE_26_0
就已经定义好了。如果使用 Xcode 16.4 编译,这个宏的值就手动定义为 260000
,这样就保证了兼容性。
在需要进行适配的地方,就只需要判断 IOS_UPCOMING_FEATURE_26
宏的值就可以:
#if IOS_UPCOMING_FEATURE_26
if (@available(iOS 26.0, *)) {
// ... adapt iOS 26 new features
}
#endif
适配新特性
- 关闭导航栏按钮的共享背景
UIBarButtonItem 新增了共享背景的特性,对于使用自定义视图的导航栏按钮,如果自定义的风格和 iOS 26 相冲突就需要关闭这个特性:
@implementation XXBarButtonItem
- (instancetype)initWithCustomView:(UIView *)customView {
if (self = [super initWithCustomView:customView]) {
#if IOS_UPCOMING_FEATURE_26
if (@available(iOS 26.0, *)) {
self.hidesSharedBackground = YES;
self.sharesBackground = NO;
}
#endif
}
return self;
}
@end
- 禁用 UIScrollView 的边缘模糊特性
iOS 26 中对 UIScrollView 新增了边缘模糊特性,内容滚动的上、下、左、右四个边缘的时候就会自动出现模糊效果,默认是开启状态。不需要这个特性可以关闭:
@implementation XXScrollView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
#if IOS_UPCOMING_FEATURE_26
if (@available(iOS 26.0, *)) {
self.topEdgeEffect.hidden = YES;
self.leftEdgeEffect.hidden = YES;
self.bottomEdgeEffect.hidden = YES;
self.rightEdgeEffect.hidden = YES;
}
#endif
}
return self;
}
@end
对于继承于 UIScrollView
的 UITextView
,UITableView
和 UICollectionView
也要同样关掉边缘模糊。
- 禁用全局导航返回手势
iOS 26 终于默认支持在导航栏视图的任意位置滑动返回了,默认是开启的。但是我们 App 早就自己实现了这个特性,所以需要禁用系统的这个特性:
@implementation XXNavigationController
- (instancetype)init {
if (self = [super initWithNavigationBarClass:XQNavigationBar.class toolbarClass:nil]) {
#if IOS_UPCOMING_FEATURE_26
if (@available(iOS 26.0, *)) {
self.interactiveContentPopGestureRecognizer.enabled = NO;
}
#endif
}
return self;
}
如果是纯 Swift 项目应该怎么适配
因为 Swift 没有预编译宏,只有条件编译指令,所以实现不了 ObjC 这样的在静态编译期间进行特性适配。
一个折中的方案是在 ObjC 中子类化需要适配的类,在 Swift 中继承或者使用子类。
如果还没有完全适配好
如果目前还没有精力进行 UI 风格适配,或者只是想测试 App 在 iOS 26 上运行有没有其他兼容性问题,可以在 Info.plist
中把新 UI 风格关闭:
<key>UIDesignRequiresCompatibility</key>
<true/>