跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Objective-C大前端

iOS 26 系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取

总结了 iOS 26 系统下的五个主要兼容问题及解决方案:包括 UITabBar 液态玻璃效果的隐藏方法(Info.plist 配置)、NavigationItem 尺寸适配调整、KVC 注入限制处理、AVAsset 视频转码权限错误(需拷贝至沙盒)、以及 WiFi SSID 获取方式变更(改用 NEHotspotNetwork)。

moshang发布于 2026/4/5更新于 2026/10/24110 浏览

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. NavigationItem.titleView 尺寸适配问题

在 iOS 26 上,使用 UILayoutFittingExpandedSize 设置自定义的 navigationItem.titleView 内容时高度偏大,变为屏幕高度,预期应为导航栏高度。

原因:在 iOS 26 之前 UILayoutFittingExpandedSize 最大尺寸限制在导航栏范围内,而在 iOS 26 则允许充斥整个屏幕。

- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }

兼容处理:修改 intrinsicContentSize,指定 titleView 的尺寸大小为导航栏大小。

#define SCREEN_WIDTH ([[UIScreen mainScreen] nativeBounds].size.width / [[UIScreen mainScreen] nativeScale])
- (CGSize)intrinsicContentSize { return CGSizeMake(SCREEN_WIDTH, 44); }

3. UITabBarController KVC 注入失效

调用 self.setValue(_:forKey:) 自定义 tabBar 在 iOS 26 后失效。

原因:iOS 26 之后对 UITabBarController 的 KVC 注入限制,导致无效,但不会 Crash。

兼容处理:

  • 方案 1:使用兼容模式显示传统 UI 风格,取消 TabBar 液态玻璃效果(参考第 1 点 Info.plist 配置)。
  • 方案 2:改为使用系统的 UITabBarItem 组件,能够支持新系统的液态玻璃效果。
  • 方案 3:降低 Xcode 版本到 Xcode 25 及以下版本,然后再打包。

4. AVAsset 视频转码权限错误

创建由 URL 标识的代表任何资源的 Asset 对象时报错:

AVAssetExportSessionStatusFailed: Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={ NSUnderlyingError=0x... }

原因:AVAssetExportSession -11800 / -16979 转码失败。权限不足、文件不可读。iOS 26 对相册视频读取权限收紧,传入的 originFilePath (如 file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV) 没有读的权限。

兼容处理:先将相册的视频拷贝到 App 沙盒临时目录,然后再去创建资源对象 AVURLAsset。

// originFilePath 示例:file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:originFilePath options:nil]; 

// 兼容处理代码
[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. WiFi SSID 获取方式变更

通过 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 ?? "")
}

目录

  1. 1. UITabBarButtonItem 液态玻璃效果
  2. 2. NavigationItem.titleView 尺寸适配问题
  3. 3. UITabBarController KVC 注入失效
  4. 4. AVAsset 视频转码权限错误
  5. 5. WiFi SSID 获取方式变更

更多推荐文章

查看全部
  • OpenVLA 深度解析:基于 Prismatic VLM 的离散化动作预测方案
  • Pi0 机器人大模型昇腾 A2 环境部署与性能测评
  • 基于 YOLO 的纺织品缺陷检测系统:模型对比、训练代码与 Web 应用
  • C++ 二叉搜索树详解:增删查改与 key/value 场景实现
  • 系统架构师技术复盘:Flowable、软考备考与 AIGC 实践之路
  • 大模型行业趋势研判:未来发展的十个关键判断
  • Jetson + OpenClaw + 飞书机器人:构建边缘设备 AI Agent 远程交互系统
  • 前端动画库选择指南:CSS、Framer Motion、GSAP 与 React Spring
  • 基于 Spring Boot 的 Java 电子商务网站设计与实现
  • OpenClaw 新版本详解:支持 GPT-5.4 与记忆热插拔,社区 Star 数破 28 万
  • AI 智能体 Claude Code 高级编程技巧与实战详解
  • XRoboToolkit 基于 PICO 4 Ultra 的机器人遥操作方案
  • Python 人工智能开发核心基础库详解
  • Python 百度搜索 API 快速入门与集成使用
  • 4S 店车辆管理系统的设计与实现
  • SSL VPN 安全防御:防范隧道内部攻击流量
  • 清华创新领军工程博士初审通过数据与复试数学考点整理
  • π0 源码剖析:基于 PaLI-Gemma 的扩散策略与 C/S 架构部署
  • macOS 使用 Codex CLI 登录报错 403 的问题分析与解决方案
  • 使用 Llama3、Web UI 和 Open Interpreter 构建智能开发环境

相关免费在线工具

  • 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