iOSDFUライブラリを使う
アップデートを行う際に使うライブラリです。Exampleが一緒に付属してくれているのですが、UIをいじっている部分が多く理解しずらかったのでアップデート機能の部分だけをかいつまんでまとめます。
アップデートしてるところ
アップデートを行なっているのはこの部分です。
CoreBluetoothまたはRxBluetoothKitでペリフェラルと接続した時点で呼び出します。
let dfuIdentifier = DFUServiceInitiator(target: peripheral, queue: .main)
var dfuController : DFUServiceController!
do {
dfuController = dfuIdentifier.with(firmware: try DFUFirmware.fromCustomZip()).start()
} catch {
}
DFUFirmwareの拡張
DFUFirmwareはfromCustomZip()とfrom()を持っていないので拡張します。
これはexampleからコピーしてきたので同じです。urlsのディレクトリをアップデートファイルが置いてあるパスに書き換えればアップデートできます
extension DFUFirmware {
private static func from(urlToZipFile url: URL?, type: DFUFirmwareType) throws -> DFUFirmware {
let firmware = DFUFirmware(urlToZipFile: url!, type: type)
return firmware!
}
static func fromCustomZip() throws -> DFUFirmware {
let urls = Bundle.main.urls(forResourcesWithExtension: "zip", subdirectory: "アップデートファイルのフォルダパス")
return try DFUFirmware.from(urlToZipFile: urls?.first, type: .softdeviceBootloaderApplication)
}
}
アップデートが行われるか確認
上記の2つでアップデートはできるのですが、ログも全く出ないため進んでいるのか失敗したのかもわかりません。
そこで、DFUProgressDelegatに準拠させて簡単なログを出力してみます。
dfuIdentifier.progressDelegate = self
extension ViewController :DFUProgressDelegate{
func dfuProgressDidChange(for part: Int, outOf totalParts: Int, to progress: Int, currentSpeedBytesPerSecond: Double, avgSpeedBytesPerSecond: Double) {
print("アップデート中")
}
}
アップデートが進んでいる場合メソッドが呼ばれprintデバッグが確認できます。exampleは結構作り込んであって難しそうに見えますが、アップデートしている部分を絞ってみて見るとすごく簡単にアップデートができます。
iOSDFUライブラリすごい!