iOS 开发:适配 iOS 26

Jun 12, 2025 • 预计阅读时间 2 分钟

使用宏判断 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

适配新特性

  1. 关闭导航栏按钮的共享背景

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
  1. 禁用 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

对于继承于 UIScrollViewUITextViewUITableViewUICollectionView 也要同样关掉边缘模糊。

  1. 禁用全局导航返回手势

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/>
iOS
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

让 Apple AI 相关的域名走代理

在 FreeBSD 上使用 certbot 自动配置 cloudflare 申请证书