【iOS】（version up update）バージョン判定およびアップデートの処理の定義

~~~Objective-C:UpdateStatus.m
typedef NS_OPTIONS(NSInteger, UPDATE_STATUS) {
    UPDATE_NONE                 = 0,  // 変更なし
    UPDATE_ANY,                       // 任意
    UPDATE_CONFIRM,                   // 確認
    UPDATE_FORCED,                    // 強制
};
~~~

はい！

これ以上に種類があれば追加していきます。

#はじめに
アプリをリリースしていくとアップデートというのが付きっきりになっていきます。
毎回、現場でアップデートの切り出しで処理を書いていくのですがこれを定めておきたい！
という願望もありつつここに書いていきます。

## アップデートの種類

- 強制アップデート
- 確認アップデート
- 任意アップデート
- 変更なし

この種類なのかなと思っております。

## 用語の整理

### 強制アップデート
強制的にアップデートを行う時に用います。

用途としては、DB（データベース）が大幅に書き換わった場合やアプリ自体が大幅に変わった場合にする方法です。

### 確認アップデート
アップデートを確認をした後に処理を行います。
強制アップデートよりは強制力がない。
特に、バージョンにより機能が使えないページもしくは機能が存在する場合はこれを用いる。

用途としては、機能がバージョンにより変わるアプリの場合、元々のユーザーがいた場合、アプリを利用できるようにする方法です。

### 任意アップデート
確認アップデートよりもそんなに必要がない時に用います。
特に、色の変更やフォントの変更などの細かな修正がある場合などに用います。

用途としては、小さなバグの回収などで機能が少し変わる場合、毎回アップデートをする必要がない場合は、ユーザーの意思でアプリを利用できるようにする方法です。

### 変更なし
今のバージョンとアプリのバージョンが同じ場合です。

用途としては、特に書く必要がないですが、何も行わずに次の処理に移行できます。

#### 注意
そして、ここでは、ビルドバージョンを持って切り分けることを前提に書いております。
他にいい方法があったら教えてください。

今のビルドバージョンが 1.0.0 だったとして、ネットワークや何かのデータベースで強制的にバージョンアップをして欲しいという時にこの処理を書いていきます。

### 今回提案したいのは、

## 1.2.3 とした時・・・
- 1つ目の1.の部分を 強制アップデート
- 2つ目の2.の部分を 確認アップデート
- 3つ目の3.の部分を 任意アップデート
- つ目以降がある場合も任意アップデート
- それ以外、全てが同じだった場合は、アップデートなし

として書き出した場合は以下のようになります。

~~~Objective-C:UpdateStatus.h

@property (retain,nonatomic) NSDictionary *selectForceUpdateInfo;

~~~

~~~Objective-C:UpdateStatus.m

/// アップデートステータスを取得する
- (UPDATE_STATUS)getUpdateStatus {
    /// アップデートの初期設定：アップデートなし
    UPDATE_STATUS updateStatus = UPDATE_NONE;
    NSString *requiredVersion = self.selectForceUpdateInfo[@"required_version"];
    NSArray *requiredVersions = [requiredVersion componentsSeparatedByString:@"."];
    // バージョン：Version
    // NSString *shortVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
    // NSArray *shortVersions = [shortVersion componentsSeparatedByString:@"."];
    // ビルドバージョン：Build
    NSString *bundleVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"];
    NSArray *bundleVersions = [bundleVersion componentsSeparatedByString:@"."];
    if ([requiredVersions count] > 0) {
        if ([requiredVersions[0] integerValue] == [bundleVersions[0] integerValue]) {
            if ([requiredVersions[1] integerValue] == [bundleVersions[1] integerValue]) {
                
                if ([requiredVersions[2] integerValue] == [bundleVersions[2] integerValue]) {
                    if ([requiredVersion isEqualToString:bundleVersion]) {
                        
                    } else {
                        // 任意アップデート
                        updateStatus = UPDATE_ANY;
                    }
                } else {
                    // 任意アップデート
                    updateStatus = UPDATE_ANY;
                }
            } else {
                // 確認アップデート
                updateStatus = UPDATE_CONFIRM;
            }
        } else {
            // 強制アップデート
            updateStatus = UPDATE_FORCED;
        }
    }
    
    return updateStatus;
}
~~~

このメソッドから「<B>UPDATE_STATUS</B>」を元に、UIAlertController でアップデートの切り分けをしたり、アップデート画面を表示したり、ログイン画面に戻ったりというだし訳を行うことができます。

いろんな現場でもそのバージョンの設定があったり、Androidでは表現できなかったりすることもありますので、言い切れないですがこういうのがあったなって思い出してもらえたら幸いです。

ぜひ試してみてください！

# 履歴
・[強制バージョンアップの作り方議論](https://qiita.com/sunstripe2011/items/b3cfa6f0f9cf3fcbd485)
・[【iOS】バージョン判定およびアップデートの処理の定義](https://qiita.com/sunstripe2011/items/0feace6163333a94ce22)
・[【iOS】アプリ内にアップデート機能を導入する方法](https://qiita.com/sunstripe2011/items/04d1bf91da10551a9d5d)

## 関連記事

---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１ WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)

緩募


### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
https://twitter.com/sunstripe2011

#### プログラミングラボ
https://twitter.com/PLab2020

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

#### トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

### キャリア教育事業

#### 青空プログラミング
[![青空プログラミング100px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/603d53ab-828b-645e-a415-1b6f158d7356.png)](https://actcoin.jp/project/detail.php?id=600)

[![ダウンロード (9).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/9bde9318-28c2-ce74-d4c5-326168061bcc.jpeg)](https://www.youtube.com/hashtag/%E9%9D%92%E7%A9%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

#### 広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集

## ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております

## ビヨンドXプロジェクト

[ビヨンドXプロジェクト全体会議](https://www.youtube.com/playlist?list=PLaR6-YWiGWkYhEHWnt8f1z-JC0g3nwwC9)