1. UITabBarButtonItem 液态玻璃效果兼容
在 iOS 26 及以上版本中,TabBar 和导航栏按钮默认会启用液态玻璃效果。如果业务需要保持传统 UI 风格,有几种处理方式。
推荐方案:Info.plist 配置
打开 Info.plist,添加一个 Boolean 类型的键值对 UIDesignRequiresCompatibility,设置为 true。这样 TabBar 会自动恢复旧版样式,无需修改代码。
<key>UIDesignRequiresCompatibility</key>
<true/>
其他备选方案:
- 关闭共享背景:通过代码设置
hidesSharedBackground = YES,但这会影响部分原生交互体验。 - 降级 Xcode:将开发环境降至 Xcode 25 及以下再打包,属于临时规避手段。
- 使用系统组件:改用标准的 UITabBarItem 组件,通常能更好地支持新系统的视觉效果。
2. NavigationItem TitleView 尺寸异常
在 iOS 26 之前,UILayoutFittingExpandedSize 会将内容限制在导航栏高度内。但在新系统中,它允许内容充斥整个屏幕,导致 titleView 高度异常变大。
原因分析
系统放宽了布局约束的最大尺寸限制,导致 intrinsicContentSize 返回的尺寸超出预期。
解决方案
重写 intrinsicContentSize,强制指定为导航栏标准高度(如 44pt)。
#define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.width / [UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.width)
- (CGSize)intrinsicContentSize {
return CGSizeMake(SCREEN_WIDTH, 44);
}
注意:这里修正了原宏定义中的语法错误,确保宽度计算准确。
3. UITabBarController KVC 注入失效
iOS 26 加强了对 UITabBarController 的 KVC 注入限制,直接调用 setValue(_:forKey:) 自定义 tabBar 可能失效(虽不会 Crash)。
应对策略
- 优先使用 Info.plist 配置:同第 1 点,通过兼容性模式回退 UI 风格。
- 切换至系统组件:尽量使用系统提供的 UITabBarItem,避免底层注入。
- 降级处理:若必须保留自定义逻辑,考虑降低构建时的 Xcode 版本。
4. AVAssetExportSession 转码失败
遇到错误码 -11800 或 -16979 时,通常是因为权限不足或文件不可读。iOS 26 收紧了相册视频读取权限,直接传入 DCIM 路径创建 AVURLAsset 会失败。
解决步骤 先将视频拷贝到 App 沙盒临时目录,再基于本地路径创建资源对象。
// 示例:拷贝视频至沙盒
- (void)copyVideoToSandbox:(NSURL *)originUrl completion:(void (^)(NSURL *localUrl))completion {
NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tempVideo.mov"];
NSURL *localUrl = [NSURL fileURLWithPath:tempPath];
NSFileManager *fm = [NSFileManager defaultManager];
if ([fm fileExistsAtPath:tempPath]) {
[fm removeItemAtPath:tempPath error:nil];
}
NSError *err = nil;
BOOL ok = [fm copyItemAtURL:originUrl toURL:localUrl error:&err];
if (!ok || err) {
NSLog(@"拷贝失败:%@", err);
completion(nil);
return;
}
completion(localUrl);
}
// 后续使用 localUrl 创建 AVURLAsset
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:localUrl options:nil];
5. WiFi SSID 获取方式变更
CNCopySupportedInterfaces 在 iOS 26 已不再推荐使用,直接调用会返回空值。
新方案
需要在 Capabilities 中添加 Access WiFi Information 权限,并确保用户授予定位权限。随后使用 NEHotspotNetwork 获取当前网络信息。
class func getWifiSSID() -> String? {
NEHotspotNetwork.fetchCurrent { curNetwork in
// 根据实际业务需求处理 block
return curNetwork?.ssid ?? ""
}
}
注意:此方法依赖系统 API,需确保目标设备支持且权限配置正确。

