いい感じにインストールされたアプリのバージョンをトラッキングしてくれるSwiftyVersionTrackerを作った


サマリ

GitHubはこちらSwiftyVersionTracker

  • GBVersionTrackingを元にしています。
  • インストールされたアプリのバージョンを時系列に保存します。
  • Protocol Orientedな実装なので、バージョン番号のルールはプロジェクトに応じて柔軟に実装できます。
  • とはいえ、殆どのプロジェクトは1.0.0(整数繰り上げ)とかのルールだと思いますので、すぐに使えるよう整数用の構造体を実装済みです。
  • 便利なプロパティを用意しています。
  • 下記、基本的にはREADME.mdの日本語訳です。

Quick Look

let tracker = try! SwiftyVersionTracker<SwiftyVersionIntInt>()

if tracker.isFirstLaunchEver {
  // do something
  // e.g. shows welcome screen
}

if tracker.isFirstLaunchForVersion {
  // do something
  // e.g. shows release note
}

if tracker.last?.major == 1 {
  // do something
  // e.g. migrate database
}

使い方

プロパティ

プロパティ 用途
isFirstLaunchEver: Bool インストール後初回起動かどうかを返します
isFirstLaunchForVersion: Bool 今回起動のバージョンで初めての起動かどうかを返します
isFirstLaunchForBuild: Bool 今回起動のビルドで初めての起動かどうかを返します
current: T 現在のバージョンを返します
previous: T? 一つ前にインストールされていたバージョンを返します
first: T 最初にインストールされたバージョンを返します
last: T? 最後に起動されたバージョンを返します
history: [T] これまでインストールされたバージョン履歴を返します

T

SwiftyVersionTrackerはプロトコル指向プログラミングで実装されています。バージョンを表すルールは会社やアプリに応じて様々あると思います。SwiftyVersionプロトコルに準拠していれば、バージョンを表す構造体/クラスTを自由に実装できますので、要件に応じて柔軟に対応出来るようになっています。

SwiftyVersion

SwiftyVersionは下記で表されるシンプルなプロトコルです。

public protocol SwiftyVersion: Equatable {
    associatedtype VersionLetters: Comparable
    associatedtype BuildLetters: Comparable

    var major: VersionLetters { get }
    var minor: VersionLetters { get }
    var release: VersionLetters { get }
    var build: BuildLetters { get }

    init(versionString: String?, buildString: String?) throws
}

バージョニングの考え方はWikipediaをご参照下さい

SwiftyVersionIntInt: SwiftyVersion

ただインストールバージョンをトラッキングしたいだけなのに1から実装するのはめんどくさい!という方(ほとんどだとおもいますが)のために、SwiftyVersionIntIntを同梱しています。IntIntという名前の通り、バージョン番号にもビルド番号にも整数しか使わないユースケースで利用できます。具体的には下記をご覧ください。

let version = try! SwiftyVersionIntInt(versionString: "1.2.3", buildString: "4")

XCTAssertEqual(version.major, 1)
XCTAssertEqual(version.minor, 2)
XCTAssertEqual(version.release, 3)
XCTAssertEqual(version.build, 4)

SwiftyVersionTracker

T: SwiftyVersionが実装できたら、ようやくSwiftyVersionTrackerの出番です。SwiftyVersionTrackerを初期化する際は、2つの選択肢があります。

1. Bundleを使う方法

1つ目はバンドルを使う方法で、殆どのアプリケーションに最適です。SwiftyVersionTrackerを引数なしで初期化すると、ターゲットに設定したVersionBuildを使って、ジェネリクスで指定したSwiftyVersionを初期化します。

サンプルは下記の通りです。

let tracker = try! SwiftyVersionTracker<YourVersion>()

2. 独自バージョン管理を使う方法

バージョン情報をそれ以外の方法で管理している場合は、初期化時にversionStringbuildStringパラメータに指定できます。

let tracker = try! SwiftyVersionTracker<YourVersion>(versionString: "1.2.3", buildString: "a123")

App Extensionsの中で使う場合

アプリ本体とExtensionsで共通して使いたい場合は、初期化時にuserDefaultsパラメータを指定することで、App Groupに対応した保存先を使えます。