From 920c24456a3c631ccf4995f881821db261097c43 Mon Sep 17 00:00:00 2001 From: km2023 Date: Mon, 13 Apr 2026 18:41:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:sdk=20=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=9C=89=E6=96=B0=E5=9B=BA=E4=BB=B6=E5=8F=AF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++++---- Sources/DuooomiBleSDK/DuooomiBleSDK.swift | 15 +++++++++++++++ demo/Sources/WrapperTestView.swift | 4 +++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 98996a6..27f5442 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,21 @@ let sdk = DuooomiBleSDK(config: .init( | 方法 | 返回 | 说明 | |------|------|------| | `fetchLatestFirmware(identifier:status:)` | `FirmwareInfo?` | 查询最新固件,nil 表示无可用版本 | +| `hasNewerFirmware(deviceVersion:serverVersion:)` | `Bool` | 对比版本号末尾10位时间戳,判断是否有新版本。参数无效返回 false | | `upgradeFirmware(fileUrl: String)` | `Void` | OTA 传输固件包到设备 | ```swift // 1. 查询最新固件 let info = try await sdk.fetchLatestFirmware() -// 2. OTA 升级 -if let info { - try await sdk.upgradeFirmware(fileUrl: info.fileUrl) -} + +// 2. 检查是否有新版本 +let needUpdate = sdk.hasNewerFirmware( + deviceVersion: sdk.version, // 当前设备版本 + serverVersion: info?.version // 服务端最新版本 +) + +// 3. OTA 升级 +try await sdk.upgradeFirmware(fileUrl: info.fileUrl) ``` ### 可观察状态 diff --git a/Sources/DuooomiBleSDK/DuooomiBleSDK.swift b/Sources/DuooomiBleSDK/DuooomiBleSDK.swift index fb85909..95ccab3 100644 --- a/Sources/DuooomiBleSDK/DuooomiBleSDK.swift +++ b/Sources/DuooomiBleSDK/DuooomiBleSDK.swift @@ -385,6 +385,21 @@ public final class DuooomiBleSDK: ObservableObject { return try await firmwareService.fetchLatest(identifier: identifier, status: status) } + /// 比较设备版本和服务端版本,判断是否有新固件可用。 + /// 对比规则:取版本号末尾 10 位时间戳比较大小。 + /// - Parameters: + /// - deviceVersion: 当前设备版本号。 + /// - serverVersion: 服务端最新版本号。 + /// - Returns: 服务端版本更新返回 true,参数无效返回 false。 + public func hasNewerFirmware(deviceVersion: String?, serverVersion: String?) -> Bool { + guard let device = deviceVersion, let server = serverVersion, + device.count >= 10, server.count >= 10 else { return false } + let deviceTs = device.suffix(10) + let serverTs = server.suffix(10) + guard let d = Int(deviceTs), let s = Int(serverTs) else { return false } + return s > d + } + /// 传输固件包到设备(OTA 升级)。 /// - Parameter fileUrl: 固件文件的下载地址(从 `fetchLatestFirmware()` 获取)。 /// - Throws: 未连接、下载失败、传输失败等。 diff --git a/demo/Sources/WrapperTestView.swift b/demo/Sources/WrapperTestView.swift index f61e6cb..bc43a9a 100644 --- a/demo/Sources/WrapperTestView.swift +++ b/demo/Sources/WrapperTestView.swift @@ -200,6 +200,7 @@ struct WrapperTestView: View { if let info = firmwareInfo { VStack(alignment: .leading, spacing: 6) { LabeledContent("Latest", value: info.version) + LabeledContent("Has Update", value: sdk.hasNewerFirmware(deviceVersion: sdk.version, serverVersion: info.version) ? "Yes" : "No") if let size = info.fileSize { let bytes = Int(size) ?? 0 LabeledContent("Size", value: ByteCountFormatter.string(fromByteCount: Int64(bytes), countStyle: .file)) @@ -429,7 +430,8 @@ struct WrapperTestView: View { let info = try await sdk.fetchLatestFirmware(identifier: brand, status: firmwareStatus) firmwareInfo = info if let info { - log("firmware latest: \(info.version)", level: .success) + let hasUpdate = sdk.hasNewerFirmware(deviceVersion: sdk.version, serverVersion: info.version) + log("firmware latest: \(info.version), hasUpdate=\(hasUpdate)", level: .success) } else { log("no firmware available", level: .info) }