文章目录第一部分Kingfisher —— 图片加载神器1. 安装2. 基础用法3. 进阶技巧占位图与过渡动画**学习重点**理解 Kingfisher 的 Options 配置比如 downsampling (降采样) 可以防止大图撑爆内存。第二部分CryptoKit —— 原生安全加密1. 哈希函数2. 密钥生成与加解密3. 数字签名第三部分Nordic DFU —— 蓝牙固件升级1. 准备工作2. 核心流程3. 代码实战4. 注意事项 (坑点)综合实战场景IoT 图片安全下载器第一部分Kingfisher —— 图片加载神器Kingfisher 是由国内知名开发者 onevcat 开发的它是 iOS 版的 “Picasso”Android端著名图片库。它不仅能加载网络图片还能自动处理内存缓存和磁盘缓存。1. 安装通常使用Swift Package Manager (SPM)或CocoaPods。SPM: 在 Xcode 中File Add Packages输入地址https://github.com/onevcat/KingfisherCocoaPods:pod Kingfisher2. 基础用法最核心的功能是将 URL 转化为 Image。importKingfisherimportSwiftUI// SwiftUI 示例structImageViewDemo:View{varbody:someView{// 异步加载图片自动缓存AsyncImage(url:URL(string:https://example.com/image.png)){imageinimage.resizable()}placeholder:{ProgressView()}.frame(width:200,height:200)// 或者使用 Kingfisher 的 KFImage (更强大的功能)KFImage(URL(string:https://example.com/image.png)).placeholder{ProgressView()}.resizable().frame(width:100,height:100)}}3. 进阶技巧占位图与过渡动画leturlURL(string:https://example.com/profile.png)letimageViewUIImageView()// UIKit 用法imageView.kf.setImage(with:url,placeholder:UIImage(named:placeholder),// 加载中显示的图片options:[.transition(.fade(0.5)),// 淡入动画.cacheOriginalImage// 缓存原图])学习重点理解 Kingfisher 的Options配置比如 downsampling (降采样) 可以防止大图撑爆内存。第二部分CryptoKit —— 原生安全加密从 iOS 13 开始苹果推出了CryptoKit。这是 Swift 原生的加密框架比第三方库如 CommonCrypto更安全、更易用。1. 哈希函数用于校验数据完整性常用于验证下载的文件是否被篡改。importCryptoKitletinputDataData(Hello World.utf8)// SHA256 哈希lethashSHA256.hash(data:inputData)lethashStringhash.compactMap{String(format:%02x,$0)}.joined()print(SHA256:\(hashString))2. 密钥生成与加解密使用SymmetricKey进行对称加密加密和解密用同一把钥匙。importCryptoKit// 1. 生成一个随机密钥 (必须是24字节用于ChaChaPoly)letkeySymmetricKey(size:.bits256)// 2. 加密letmessage这是一条机密消息.data(using:.utf8)!do{letsealedBoxtryChaChaPoly.seal(message,using:key)letencryptedDatasealedBox.ciphertext// 加密后的数据// 3. 解密letopenedBoxtryChaChaPoly.open(sealedBox,using:key)letdecryptedMessageString(data:openedBox,encoding:.utf8)print(解密后:\(decryptedMessage??nil))}catch{print(加密/解密错误:\(error))}3. 数字签名用于验证消息是否来自特定发送者常用于登录 token 验证。importCryptoKit// 私钥签名公钥验证letprivateKeyP256.KeyAgreement.PrivateKey()letpublicKeyprivateKey.publicKeyletdataToSign重要指令.data(using:.utf8)!// 签名letsignaturetry!privateKey.signature(for:dataToSign)// 验证ifpublicKey.isValidSignature(signature,for:dataToSign){print(签名验证通过消息未被篡改)}第三部分Nordic DFU —— 蓝牙固件升级这是最难的部分。Nordic Semiconductor 的芯片nRF51/nRF52系列在物联网设备中非常流行。DFU (Device Firmware Update) 允许你通过蓝牙给设备刷固件。1. 准备工作硬件: 一个支持 Nordic DFU 的蓝牙设备。固件文件: 通常是一个.zip文件包含 init packet 和固件 bin。库安装:SPM:https://github.com/NordicSemiconductor/IOS-Pods-DFU-LibraryCocoaPods:pod iOSDFULibrary权限: 在Info.plist中添加蓝牙权限 (NSBluetoothAlwaysUsageDescription)。2. 核心流程DFU 流程分为三步扫描设备 - 连接设备 - 发起升级。你需要实现DFUServiceDelegate来监听进度。3. 代码实战第一步导入框架importiOSDFULibraryimportCoreBluetooth第二步初始化 DFU 服务假设你已经通过CoreBluetooth找到了目标设备对象。classDFUManager:NSObject,DFUServiceDelegate,DFUProgressDelegate{vardfuController:DFUServiceController?// 发起 DFU 升级funcstartDFU(targetDevice:CBPeripheral,firmwareURL:URL){// 1. 设置日志打印可选调试用letloggerLoggerDelegate(type:.debug)// 2. 初始化 DFU 服务// forceDfu true: 强制即使特征值不一致也尝试升级letdfuServiceInitiatorDFUServiceInitiator(target:targetDevice)dfuServiceInitiator.delegateself// 回调状态dfuServiceInitiator.progressDelegateself// 回调进度dfuServiceInitiator.loggerlogger// 3. 加载固件文件letfirmwareDFUFirmware(urlToZipFile:firmwareURL)// 4. 启动dfuControllerdfuServiceInitiator.with(firmware:firmware).start()}}// MARK: - 代理方法实现extensionDFUManager{// 状态回调funcdfuStateDidChange(to state:DFUState){switchstate{case.connecting:print(正在连接设备...)case.starting:print(DFU 服务启动中...)case.uploading:print(正在上传固件...)case.validating:print(正在验证固件...)case.disconnecting:print(断开连接...)case.completed:print(升级成功)case.aborted:print(升级被中止)default:break}}// 进度回调 (百分比)funcdfuProgressDidChange(forpart:Int,outOf totalParts:Int,to progress:Int,currentSpeedBytesPerSecond:Double){print(上传进度:\(progress)%)// 在这里更新 UI 进度条}// 错误回调funcdfuError(_error:DFUError,didOccurErrorWith message:String){print(升级错误:\(message))}}4. 注意事项 (坑点)文件格式: Nordic 的 DFU 库只接受.zip格式的固件包。这个包通常由 Nordic 的nrfutil命令行工具生成包含软设备和应用固件。后台任务: 如果应用进入后台DFU 可能会中断。你需要申请后台蓝牙权限或者在 App Delegate 中处理后台任务。设备模式: Nordic 设备在 DFU 模式下广播的名字通常变为 “DfuTarg” 或类似名称扫描时要注意过滤。综合实战场景IoT 图片安全下载器为了串联这三个知识点设想一个需求App 从服务器下载一张图片验证其哈希值然后准备通过蓝牙发送给设备假设设备支持接收数据。importSwiftUIimportKingfisherimportCryptoKitimportiOSDFULibrary// 假设已导入classIoTViewModel:ObservableObject{PublishedvarimageHash:String// 1. 使用 Kingfisher 下载图片并获取 DatafuncdownloadAndVerifyImage(url:URL){KingfisherManager.shared.retrieveImage(with:url){resultinswitchresult{case.success(letvalue):// 获取原始数据letimageDatavalue.data(as:.png)// 2. 使用 CryptoKit 计算哈希lethashSHA256.hash(data:imageData!)lethashStrhash.compactMap{String(format:%02x,$0)}.joined()self.imageHashhashStrprint(图片 SHA256:\(hashStr))// 3. 如果需要这里可以触发 Nordic DFU 发送数据给设备// self.sendToBLEDevice(data: imageData!)case.failure(leterror):print(error)}}}}