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

AI入门系列:人工智能ABC:AI核心概念速通教程

AI入门系列:人工智能ABC:AI核心概念速通教程

前言 记得刚开始学习人工智能的时候,我被各种专业术语搞得晕头转向。什么"神经网络"、“深度学习”、“监督学习”、“无监督学习”,听起来都很高大上,但就是搞不清楚它们之间的关系。 有一次,我向一位AI专家请教,他用了一个很形象的比喻:"学习AI就像学习开车,你不需要先了解发动机的工作原理,但需要知道方向盘、油门、刹车的作用。"这句话让我茅塞顿开。 所以,在这篇文章中,我想用最通俗易懂的语言,带大家快速了解AI的核心概念。我们会像搭积木一样,从最基本的概念开始,逐步构建起对AI的整体认识。 AI是什么?一个简单的定义 AI,全称人工智能,就是让机器表现出智能行为的技术。 但是,这个定义太抽象了。让我们用一个生活中的例子来理解: 想象你有一个智能音箱,你对它说:"今天天气怎么样?"它回答:"今天晴,最高温度25度。"这就是一个AI系统在工作。 它做了什么?

By Ne0inhk
【保姆级教程】小白也能搞定!手把手教你部署AI小说生成器

【保姆级教程】小白也能搞定!手把手教你部署AI小说生成器

目录 一、 磨刀不误砍柴工:环境准备 二、 第一次安装:给代码安个家 第一步:把项目“搬”回家 第二步:造一个专属“房间” 第三步:安装依赖 第四步:点火启动 三、 关机重启后:如何再次开启? 四、 关键一步:配置“大脑”(API接口) 五、开始你的创作 六、写在最后:为什么推荐用蓝耘做“大脑”? 在这个AI辅助创作爆发的时代,拥有一款属于自己的本地AI写作工具,无疑是许多文字工作者的梦想。最近拿到一份AI小说生成器的部署文档,虽然功能强大,但对于非技术出身的朋友来说,那些代码和命令行多少有些“劝退”。 别担心,今天我们就把这份“天书”翻译成“人话”,手把手带你从零开始,搭建属于你的AI创作助手。无论你是第一次安装,还是关机后不知道怎么重启,这篇教程都能帮你搞定。

By Ne0inhk
从MVP到千万级并发 AI在前后端开发中的差异化落地指南

从MVP到千万级并发 AI在前后端开发中的差异化落地指南

文章目录 * 前言 * 一、技术原理解析 * 1. 核心差异维度对比 * 2. AI 辅助开发的技术架构模型 * 二、按 DAU 规模分层的实战策略与代码实证 * 1. 低 DAU 项目(<1万):MVP 验证期 * 后端实战:从需求到接口的秒级响应 * 前端实战:快速但粗糙的 UI * 2. 中 DAU 项目(1万–100万):业务增长期 * 后端:复杂业务逻辑的精准生成 * 前端:C端体验的“陷阱” * 3. 高 DAU 项目(>100万):高并发架构期 * 后端进阶:AI 驱动的性能优化 * 高并发流程架构图 * 三、

By Ne0inhk

2233ai#wildcard对应ai,真的便宜好用吗?

wildcard被封之后一段时间我都充不上gpt会员,最近看到它网页链接的wildcard,10刀一个月,感觉便宜一点,并且2233介绍说自己之所以便宜是因为同时租了很多号,让用户均匀使用这些账号(我一看感觉也合理,负载均衡让各个账号满载运转确实会变便宜),冲了一个月的,用了不一会就感觉不对劲,这个ai智力非常低下,然后测试了一下。 使用2233所谓的gpt5-thingking模型的回答是这样的: 他甚至不是gpt4,是gpt4-mini。我又问了一个调用api的问题,回答也暴露了该模型就是gpt-4,不是gpt-5。当我问它调用gpt-5相关信息,他直接回复说不知道。 另外,我也打开了真实的gpt官网,问了相同的问题,回复是这样的: 结合gpt的真实回答和2233的回答,首先肯定的一点是2233不是真实的直接用调用最先进的api模型,告诉你用的模型也虚假的。并且数据库也是旧的! 综合建议:别买!! 更新: 不论是它的4o模型还是gpt5模型,实际上都是gpt-4o-mini! 并且gpt-4o-mini是有免费额度的,所以本质上他是创建了很多账号,用这些号的免费额

By Ne0inhk