解放区在住氷翠 緑の閃光
【解放区在住氷翠】デスクトップアプリケーション

【Swift】アプリケーションのバージョンをチェックしたい

2023-03-02

どうも、氷翠です。

今回はアプリケーションを作成していく上で管理しないといけないのが、このバージョンの管理。そして、バージョンが新しいものかどうかをチェックする必要があります。

そんなプログラムをクラスにしたので、それを読み込むだけでチェックできるようになっています。

アプリケーションのバージョンは「.(ピリオド)」で区切られているのは知っている通り。今回は「アプリケーションのバージョン」「マイナーバージョン」「パッチのバージョン」の3種類。

その変数はそれぞれ「appVersion」「minorVersion」「patchVersion」となるが、これは現在のアプリケーションのバージョン情報。そして、今回はAppStoreで配布する訳ではないので、ローカルかもしくはWEBサーバー上にバージョン情報を設置してそれをチェックしていく形でやりたいと思って、今回こんなクラスを作成した経緯がある。

ということで、今回はWEBサーバー上にJSONファイルを設置。JSONファイルを読み込んで区切る。その変数は「jsonAppVersion」「jsonMinorVersion」「jsonPatchVersion」となる。

それぞれString型の変数だが、実際に比較するときはInt型に変換して比較しています。

// 現在のアプリケーションのバージョンの文字列
var appVersionString: String = "99.0.0"
// Jsonファイルの文字列
var jsonVersionString: String = "1.0.0"

読みこんだデータはそれぞれこんな変数に入れておく。その初期設定では常に現在のアプリケーションがJSONデータよりも上になっている。という感じにしておけば参照しているWEBサーバー上のバージョン情報は古いか同じバージョンということになる。

最終的な判断はBool値で判断します。

// trueならサーバーのバージョンが新しい
// falseならサーバーのバージョンは古いか同じ
var flg: Bool = false

さらにJSONデータを読み込むため、structでそもデータモデルを定義する

// JSONデータを保管するためのモデルと変数を定義
private var vd: verData = verData(version: "1.0.0")
struct verData: Codable {
    var version: String
}

最終的に「vd」という変数になるが、その中身は「version」という名称のプロパティを含んでいる。初期設定として「1.0.0」という文字列をいれておく。そこは適当な文字列でいい感じ。

クラスを読み込んだ時点で判断させるために「init」を定義しておく。

    init() {
        let dispatchGroup = DispatchGroup()
        let dispatchQueue = DispatchQueue.global(qos: .default)
        // データの取得が終わるまでまちます
        // これを使っていないと、JSONデータを取得する前に
        // データのチェックが始まってしまう。
        dispatchQueue.async(group: dispatchGroup) {
            // 現在のアプリケーションのバージョンを取得する
            self.getAppVersion()
            // JSONデータを取得する
            self.getJsonVersion()
        }
        dispatchGroup.notify(queue: .main) {
            // データの取得が終わったら比較を始める
            self.check()
        }
    }

中身は単純。

「self.getAppVersion()」で現在のアプリケーションのバージョン情報を取得するメソッド。そして「self.getJsonVersion()」でWEBサーバー上にあるバージョン情報を取得するメソッド。

その二つのメソッドで各情報を取得することができたら、「self.check()」で判断する。

でもそこで問題になったのが、WEBサーバー上にデータを設置したものを読み込むというのは、遅延が発生するだろう。でも、そこを待ってデータを取得しなくてはならない。ということで、そこは非同期処理ってのをやらないといけない。

「DispatchQueue」を利用する。今回のはGroupを使っている。これを使うことで待ってくれる。

いろいろと省いているが、動画の中でそのプログラムは組んでいるので見て欲しい。

最終的に「DispatchGroup().notify(queue: .main)」できちんと取得することが出来たあとでこの中の指定メソッドを実行。つまり「self.check()」を実行していく。

このcheckの中で最後にはAlertで警告としてダイアログを出す。ただこの部分はアプリケーションによって変更するのがいいかと思われます。

以上、今後使えそうなクラスになったので記録しておきます。

コメントを残す

メールアドレスが公開されることはありません。