跳到主要内容iOS 26 系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取 | 极客日志Objective-C大前端
iOS 26 系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取
iOS 26 系统带来多项 UI 及 API 变更,需进行兼容性适配。主要问题包括 UITabBar 液态玻璃效果导致按钮隐藏背景失效,可通过 Info.plist 配置或降低 Xcode 版本解决;UILayoutFittingExpandedSize 在标题视图高度计算上超出导航栏范围,需手动指定尺寸;UITabBarController 自定义 tabBar 的 KVC 注入被限制;AVAssetExportSession 转码因权限收紧失败,建议拷贝至沙盒临时目录处理;WiFi SSID 获取方式 CNCopySupportedInterfaces 失效,需改用 NEHotspotNetwork 并申请定位权限。
锁机制0 浏览 1. UITabBarButtonItem 液态玻璃效果
兼容处理:
第一种方式(不推荐):把所有的 UITabBarButtonItem 关闭液态玻璃效果:
if (@available(iOS 26.0, *)) {
self.navigationItem.rightBarButtonItem.hidesSharedBackground = YES;
self.navigationItem.leftBarButtonItem.hidesSharedBackground = YES;
} else {
// Fallback on earlier versions
}
第二种方式:所有导航栏按钮全部采用 UITabBarButtonItem,支持液态玻璃效果。
第三种方式:降低 Xcode 版本到 Xcode 25 及以下版本,然后再打包。
第四种方式:使用兼容模式显示传统 UI 风格,也就是取消 TabBar 液态玻璃效果:
打开 info.plist,添加一个 Boolean 键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar 恢复旧的样式:
<key>UIDesignRequiresCompatibility</key>
<true/>
2. UILayoutFittingExpandedSize 设置自定义 navigationItem.titleView 内容尺寸问题
在 iOS 26 上高度偏大,高度变为屏幕的高度,预期是高度应该为导航栏的高度。
原因:在 iOS 26 之前 UILayoutFittingExpandedSize 最大尺寸限制在导航栏范围内,而在 iOS 26 则允许充斥整个屏幕:
- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }
兼容处理:修改 intrinsicContentSize,指定 titleView 的尺寸大小为导航栏大小:
#define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width
- (CGSize)intrinsicContentSize {
return CGSizeMake(SCREEN_WIDTH, 44);
}
3. UITabBarController 调用 setValue 自定义 tabBar 失效
原因:iOS 26 之后对 UITabBarController 的 KVC 注入限制,导致无效,但不会 crash。
方案 1:使用兼容模式显示传统 UI 风格,也就是取消 TabBar 液态玻璃效果:
打开 info.plist,添加一个 Boolean 键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar 恢复旧的样式:
<key>UIDesignRequiresCompatibility</key>
<true/>
方案 2:改为使用系统的 UITabBarItem 组件,能够支持新系统的液态玻璃效果。
方案 3:降低 Xcode 版本到 Xcode 25 及以下版本,然后再打包。
4. AVAssetExportSession 转码报错
创建一个由 URL 标识的代表任何资源的 asset 对象时报错:
AVAssetExportSessionStatusFailed: Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={ NSUnderlyingError=0x1586626a0 { Error Domain=NSOSStatusErrorDomain Code=-16979 "(null)" }, NSLocalizedFailureReason=发生未知错误(-16979), NSURL=file:
原因:AVAssetExportSession -11800 / -16979 转码失败,权限不足、文件不可读。创建一个由 URL 标识的代表任何资源的 asset 对象时,传入的 originFilePath 示例:file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV,没有读的权限,因为 iOS 26 对相册视频读取权限收紧。
// originFilePath 示例:file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:originFilePath options:nil];
兼容处理:先将相册的视频拷贝到 App 沙盒临时目录,然后再去创建资源对象 AVURLAsset。
[self copyVideoToSandbox:originFilePath completion:^(NSURL *localUrl) {
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:localUrl options:nil];
}];
- (void)copyVideoToSandbox:(NSURL *)originUrl completion:(void (^)(NSURL *localUrl))completion {
NSString *temp = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tempVideo.mov"];
NSURL *localUrl = [NSURL fileURLWithPath:temp];
NSFileManager *fm = [NSFileManager defaultManager];
if ([fm fileExistsAtPath:temp]) {
[fm removeItemAtPath:temp error:nil];
}
NSError *err = nil;
BOOL ok = [fm copyItemAtURL:originUrl toURL:localUrl error:&err];
if (!ok || err) {
NSLog(@"拷贝失败:%@", err);
completion(nil);
return;
}
completion(localUrl);
}
5. 通过 CNCopySupportedInterfaces 获取 wifi ssid 的方式已失效
class func getWifiSSID() -> String? {
var wifiName: String?
let wifiInterfaces = CNCopySupportedInterfaces()
if wifiInterfaces != nil {
let interfaceArr = CFBridgingRetain(wifiInterfaces) as! [String]
if interfaceArr.count > 0 {
let interfaceName = interfaceArr[0] as CFString
let ussafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)
if ussafeInterfaceData != nil {
let interfaceData = ussafeInterfaceData as! [String: Any]
wifiName = interfaceData["SSID"] as? String ?? ""
} else {
return nil
}
}
}
return wifiName
}
原因:iOS 26 不再推荐使用 CNCopySupportedInterfaces,在 iOS 26 将返回空值。
兼容处理:Capabilities 添加 Access WiFi Information 权限;通过 CLLocationManager 确保有定位权限,然后使用 NEHotspotNetwork 获取 wifi ssid:
NEHotspotNetwork.fetchCurrent { curNetwork in
block(curNetwork?.ssid ?? "")
}
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online