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ライブラリすごい!

今日から始めるSwift

前の記事

三項演算子
Swift

次の記事

16進数をASCII codeに変換する