# IOS-OTA-Library **Repository Path**: bluexmicro/ios-ota-library ## Basic Information - **Project Name**: IOS-OTA-Library - **Description**: iOS BX-OTA SDK - **Primary Language**: Swift - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-26 - **Last Updated**: 2025-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BxOtaLibrary ## 导入Swift Package ### 方式一、从Gitee在线导入 1. `File`->`Add Packages`->搜索`https://gitee.com/bluexmicro/ios-ota-library.git`->`add package` 2. 在配置页`TARGETS`->`Frameworks,Libraries, and Embedded Content`->`+`->`BxOtaLibrary` ### 方式二、下载源码导入Local Swift Package 1. `File`->`Add Packages`->`add Local...`->选择下载好的源码->`add package` 2. 在配置页`TARGETS`->`Frameworks,Libraries, and Embedded Content`->`+`->`BxOtaLibrary` ### 方式三、下载源码复制到宿主工程下 ## 使用 1. `import BxOtaLibrary` 2. `let otaLib = BxOtaLibrary()` 3. 开始OTA ```swift //普通升级,单次连接只支持1个固件,每包发送最多19个字节的内容 otaLib.startOta(identifier: /*扫描到外设的identifier*/, task: /*OtaTask*/, delegate: /*Callback*/) //快速升级,单次连接支持传输多个文件,每包最多可以发送498个字节的内容 otaLib.startFastOta(identifier: uuid, tasks: tasks, delegate: self)// test ``` # 快速模式和普通模式是互斥的,开始之前请确认设备支持哪一种模式 ## Tips 1. 2. 传输的内容分为两种固件(Firmware)和素材(Material)两种,其中素材需要指定地址,如果你传输的是素材请在开始之前确认素材的地址 3. 宿主工程需要配置蓝牙权限 ## 例子 ```swift import BxOtaLibrary import Foundation class OtaLogic: NSObject, OtaDelegate{ func onInitialError(error errorMessage: String) { print("初始化失败:\(errorMessage)")//在开始OTA之前,1.寻找设备,2.连接设备,3.检查OTA服务 } func onTaskStateChanged(state: OtaState) { print("当前正在升级第\(state.index)任务")// let inProgress = state.startTime > 0 && state.endTime == 0 print("是否正在升级:\(inProgress), 当前进度:\(state.progress)") let end = state.startTime > 0 && state.endTime > 0 print("是否已经结束\(end), 是否成功:\(state.result)") if(end && !state.result){ let errorMsg = state.errorMessage ?? "Unknown Error" print("失败原因:\(errorMsg)") } } func onFinish() { print("所有任务结束") } let otaLib = BxOtaLibrary() func startOta(deviceUuid:String, file:SelectedFile, callback cb:OtaDelegate)->Bool{ guard let uuid = UUID.init(uuidString: deviceUuid) else{ return false } let int32Address = UInt32.init(file.hexAddress, radix: 16) //升级 素材(Material)时,需要填写地址。 let task = BxOtaTask.init(data: file.rawData, address: int32Address) //升级 固件(Firmware)时,无需地址。 // let task = BxOtaTask.init(data: file.rawData) return otaLib.startOta(identifier: uuid, task: task, delegate: self) // test } func startFastOta(deviceUuid:String, files:[SelectedFile], callback cb:OtaDelegate)->Bool{ guard let uuid = UUID.init(uuidString: deviceUuid) else{ return false } //升级 素材(Material)时,需要填写地址。 let tasks = files.map { file -> BxOtaTask in let int32Address = UInt32.init(file.hexAddress, radix: 16) return BxOtaTask.init(data: file.rawData, address: int32Address) } //升级 固件(Firmware)时,无需地址。 // let tasks = files.map { file -> BxOtaTask in // return BxOtaTask.init(data: file.rawData) //} return otaLib.startFastOta(identifier: uuid, tasks: tasks, delegate: self)// test } } struct SelectedFile{ let rawData:Data //从文件或者服务器下载的“Firmware/Material”数据 let hexAddress:String? // "EBB000" } ```