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

Python实现开源AI模型引入及测试全过程

Python实现开源AI模型引入及测试全过程

文章目录 * 摘要 * 1. 引言:开源AI生态系统概述 * 1.1 开源AI的发展现状 * 1.2 技术栈选择 * 1.3 项目目标 * 2. 环境配置与项目初始化 * 2.1 系统要求 * 2.2 创建虚拟环境 * 2.3 依赖管理文件 * 2.4 安装依赖 * 2.5 项目结构 * 3. 模型原理与架构解析 * 3.1 BERT模型原理 * 3.1.1 Transformer编码器架构 * 3.2 Hugging Face Transformers架构 * 4. 数据准备与预处理 * 4.1 数据集选择与加载

2026最新 OpenClaw 手机端部署与实战:旧手机秒变 AI 智能终端(Android/iOS 双平台全覆盖)

作为喜欢新鲜技术、热爱 AI 开发的 ZEEKLOG 博主,我必须说:OpenClaw 是2026年最值得在手机上跑一遍的开源 AI Agent。它不只是聊天,而是能真·执行任务的本地 AI 助手,手机端更是把“随时随地自动化”拉满。本文将详细拆解 OpenClaw 手机端的应用场景、部署步骤、实战玩法及避坑技巧,全程干货,读者一看就会、一跑就成。 一、OpenClaw 是什么?为什么要在手机上跑? OpenClaw 是2026年 GitHub 爆火的开源自托管 AI 执行网关,前身是 Clawdbot / Moltbot,主打“一句话让 AI 帮你完成真实操作”,核心能力包括发消息、整理文件、控制设备、自动化任务等,区别于普通对话式 AI,

2026最新 Dify 私有化部署完整教程:从0到1搭建专属AI知识库平台

2026最新 Dify 私有化部署完整教程:从0到1搭建专属AI知识库平台 本文适配 Dify 1.13.0+ 最新社区版,全程可复现,新手友好。覆盖国内服务器加速部署、外接已有MySQL/Redis(关键避坑)、云服务器DNS解析、Nginx反向代理+HTTPS、API对外提供全流程,解决部署过程中99%的坑。 前言 Dify 是一款开源的大语言模型应用开发平台,凭借可视化编排、企业级RAG知识库、全链路LLMOps能力,让个人开发者和中小企业都能快速搭建专属AI应用、知识库问答系统,还能封装成API对外提供服务。 本文基于国内云服务器环境(Ubuntu 22.04),全程使用国内加速源,重点解决了外接MySQL/Redis时的依赖报错、服务名解析失败等核心问题,最终实现生产级可用的私有化Dify平台。 你能从本文学到 1. 零基础完成Dify私有化部署,适配国内服务器环境 2. 完美复用服务器已有MySQL/Redis,不启动冗余容器(核心避坑) 3.

2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑

2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 哈喽,各位想入门AI的小伙伴!随着生成式AI、大模型应用的爆发,Python+AI已成为最热门的技术组合,无论应届生求职、职场人转型还是兴趣探索,掌握这门技能都能打开新赛道。但很多新手都会陷入“先学Python还是先学AI”“数学不好能不能学”“学完不会实战”的困境。 本文结合2026年AI技术趋势,用「知识点+核心代码+流程图+表格」的形式,从零基础打通Python+AI入门全链路,聚焦热门易上手方向,全程干货,新手可直接跟着练,老司机可查漏补缺~ 一、为什么2026年入门AI,首选Python? 很多新手会问:“学AI一定要用Python吗?Java、C++不行吗?” 答案是:不是不行,但Python是效率最高、门槛最低、生态最完善的选择,