跳到主要内容iOS 26 系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取 | 极客日志Objective-C大前端
iOS 26 系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取
总结了 iOS 26 系统下的五个主要兼容性问题及解决方案。包括 UITabBar 液态玻璃效果的兼容处理(Info.plist 配置或降级 Xcode)、navigationItem.titleView 尺寸异常修复(重写 intrinsicContentSize)、KVC 注入限制导致的自定义 TabBar 失效问题、AVAssetExportSession 因权限收紧导致的转码失败(需先拷贝至沙盒)、以及 WiFi SSID 获取 API 变更(改用 NEHotspotNetwork)。提供了相应的代码示例和配置方法。
灵魂伴侣5 浏览 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:forKey:自定义 tabBar 失效
原因:iOS 26 之后对 UITabBarController 的 KVC 注入限制,导致无效,但不会 crash。
方案 1:使用兼容模式显示传统 UI 风格,也就是取消 TabBar 液态玻璃效果:
打开 info.plist,添加一个 Boolean 键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar 恢复旧的样式:
<key>UIDesignRequiresCompatibility</key>
<true/>
方案 2:改为使用系统的 UITabBarItem 组件,能够支持新系统的液态玻璃效果。
方案 3:降低 Xcode 版本到 Xcode 25 及以下版本,然后再打包。
4. 创建一个由 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 ?? "")
}
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 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