iOS开发针对苹果新系统iOS26的兼容适配UITabBarButtonItem & UITabBar的液态玻璃效果/当前wifi ssid获取

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版本到Xcode25及以下版本,然后再打包

        第四种方式:使用兼容模式显示传统UI风格,也就是取消TabBar液态玻璃效果:

        打开info.plist,添加一个Boolean键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar恢复旧的样式:

<key>UIDesignRequiresCompatibility</key> <true/>

2.  采用UILayoutFittingExpandedSize设置自定义的navigationItem.titleView的内容尺寸,在iOS26上高度偏大,高度变为屏幕的高度,预期是高度应该为导航栏的高度;

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

- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }

        兼容处理:

        修改intrinsicContentSize,指定titleView的尺寸大小为导航栏大小:

 #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调用self.setValue(yourTabBar, forKey: "tabBar")自定义tabBar失效

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

        兼容处理:

        方案1:使用兼容模式显示传统UI风格,也就是取消TabBar液态玻璃效果:

        打开info.plist,添加一个Boolean键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar恢复旧的样式:

<key>UIDesignRequiresCompatibility</key> <true/>

        方案2:改为使用系统的UITabBarItem组件,能够支持新系统的液态玻璃效果

        方案3:降低Xcode版本到Xcode25及以下版本,然后再打包

4、创建一个由URL标识的代表任何资源的assert对象时报错:

AVAssetExportSessionStatusFailed: Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={ NSUnderlyingError=0x1586626a0 { Error Domain=NSOSStatusErrorDomain Code=-16979 "(null)" }, NSLocalizedFailureReason=发生未知错误(-16979), NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV, NSLocalizedDescription=这项操作无法完成 }

        原因:AVAssetExportSession -11800 / -16979 转码失败,权限不足、文件不可读,创建一个由URL标识的代表任何资源的assert对象时,传入的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: 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 }

        原因:iOS26不再推荐使用CNCopySupportedInterfaces,在iOS26将返回空值

        兼容处理:Capabilities添加Access WiFi Information权限;通过CLLocationManager确保有定位权限,然后使用NEHotspotNetwork获取wifi ssid:

NEHotspotNetwork.fetchCurrent { curNetwork in block(curNetwork?.ssid ?? "") }

Read more

计算机毕业设计springboot屹鑫企业行政管理系统 基于SpringBoot的企业综合事务管理平台设计与实现 基于Java的智慧企业日常运营管理系统开发

计算机毕业设计springboot屹鑫企业行政管理系统 基于SpringBoot的企业综合事务管理平台设计与实现 基于Java的智慧企业日常运营管理系统开发

计算机毕业设计springboot屹鑫企业行政管理系统ngc1fp8h (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 在全球化竞争加剧与后疫情时代双重背景下,企业面临着内部运营效率与外部市场响应的双重挑战。传统纸质化、碎片化的行政管理模式已难以适应现代组织快速决策、协同办公的需求。数字化转型不再是可选项,而是企业生存发展的必答题。如何通过信息技术重构行政业务流程,实现从"人治"到"数治"的跨越,成为摆在每个企业管理者面前的核心议题。 本文档详细记录了一套完整的企业级行政管理系统从需求分析到系统实现的全过程。系统采用Java语言与SpringBoot框架构建,以MySQL作为数据支撑,遵循"约定优于配置"的设计理念,致力于打造轻量化、高可用的数字化行政中枢。技术架构层面,系统整合MyBatis实现数据持久层优化,通过SpringMVC构建RESTful风格接口,前端采用Vue.js实现响应式交互,形成前后端分离的现代化技术栈。 系统核心功能全景 本系统涵盖以下完整功能模块: 员工基础信息管理 *

By Ne0inhk
JDK 17与JDK 21全面对比:新特性、性能差异与升级指南

JDK 17与JDK 21全面对比:新特性、性能差异与升级指南

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 💖The Start💖点点关注,收藏不迷路💖 📒文章目录 * JDK 17 vs JDK 21 如何选择? * 1. JDK版本背景与发布策略 * 1.1 Java的版本发布周期 * 1.2 JDK 17与JDK 21的定位 * 2. 核心特性对比 * 2.1 语言特性增强 * JDK 17示例:密封类 * JDK 21示例:Record模式匹配 * 2.2 性能优化 * 2.

By Ne0inhk
飞算 JavaAI:我的编程强力助推引擎

飞算 JavaAI:我的编程强力助推引擎

文章目录 * 引言:当Java开发遇上AI助手 * 初识飞算JavaAI:专为Java而生的智能伴侣 * 安装与配置:轻松上手的开始 * 核心功能体验:从需求到代码的全流程革命 * 1. 智能需求分析与拆解 * 2. 智能接口设计 * 3. 表结构智能生成 * 4. 处理逻辑自动梳理 * 5. 高质量源码一键生成 * 日常开发中的实用功能 * Java Chat:随叫随到的技术顾问 * SQL Chat:数据库开发好帮手 * 与传统工具对比:为什么飞算JavaAI更胜一筹 * JavaAI实战案例挑战计划:一周完成月工作量的奇迹 * 使用技巧与最佳实践 * 未来展望:AI辅助开发的无限可能 * 结语:每个Java开发者都值得拥有的神器 引言:当Java开发遇上AI助手 作为一名长期奋战在Java开发一线的程序员,我见证了从纯手工编码到智能辅助开发的演进历程。近年来,AI编程助手如GitHub Copilot、TabNine等工具的兴起,确实为开发者带来了便利。然而,这些通用型工具在面对Java这样具有严格规范

By Ne0inhk

Trae java项目配置全局maven和jdk

** Trae java项目配置全局maven和jdk ** 依次打开:设置-开发环境-Maven-for-Java(或全局搜索Maven-for-Java配置) 找到以下设置,点击在settings.json中编辑 在出现的配置文件中,填入以下配置: {"maven.excludedFolders":["**/.*","**/node_modules","**/target","**/bin","**/archetype-resources"],"maven.settingsFile":"你本地文件地址,例如:E:\\****\\apache-maven-3.8.4\\conf\\settings.xml","workbench.colorTheme":"Default

By Ne0inhk