今更聞けない「バージョン判定」

# はじまり

さまざまなOSのバージョンアップで軒並みエラーとか苦しめられる時期が来るプログラミングの見直し時期はいつも、新しいコードのチェックとバーションアップした時の検証

見積書には、なかなか書けないかもしれないですが、それこそ見積もらなくてはいけないこのOSバージョンアップへの対応 いつまで経っても古いままだと、警告や使えなくなっていく機能などが増えてくる

iOSの悩みどころのこの時期にチェックしておきたい。
バージョン判定のお話です。

いつも忘れてしまうので、備忘録として、iOSのバージョン判定するには、以下の方法で行うようにしていきたいって言う提案もありますが、皆さんのご意見も含めここにまとめていこうと思います。

###### Objective-C 今のバージョンが知りたい場合 の例

~~~ :Objective-C
// バージョン判定
[UIDevice currentDevice].systemVersion.floatValue >= 7;
~~~
OS version 7.0 以上と言うのが分かります。

###### Objective-C マクロを使って一行で書く方法 の例

~~~ :Objective-C 
#define SYSTEM_VERSION_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
~~~
OS version の判定の時に使えそうです。
参考：[マクロを使って一行で書く方法](https://qiita.com/shu223/items/dc1759fc9695cea27756)

~~~ :Objective-C
float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iOSVersion > 9.9f) {
    // iOS10以降の場合
} else {
    // iOS9以前の場合
}
~~~
上記のように、iOSのバージョン判定で、直接値が書く方法でもこちらは、有効です。

iOS 8.0 で NSProcessInfo に追加されたメソッドを使用すると簡単にバージョンの判定が行える。

~~~ :Objective-C
NSOperatingSystemVersion version = {8, 3, 0};
BOOL isOSVersion8_3Later = [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version];
if (isOSVersion8_3Later) {
    // iOS 8.3 以降
} else {
    // iOS 8.3 未満
}
~~~

上記のように、iOS のバージョンを簡単にマイナーバージョン等を加味して判定する方法もあるようですね。
参考：[iOS のバージョンを簡単にマイナーバージョン等を加味して判定する方法](http://qiita.com/ktysne/items/31bbcb9cd0508e29a7aa)

~~~ :Objective-C
- (BOOL)isOS10 {
    BOOL isOS10 = NO;
    if ( floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max ) {
        // iOS10以降の場合
        isOS10 = YES;
    } else {
        // iOS9以前の場合
    }
    return isOS10;
}
~~~
上記のように、iOS のバージョンを判定する場合においては、こちらのisOSXX を用意しておくのも後々開発の時に便利かもですね。

> 理由としては、OSを全体にバージョンアップした場合は要らなくなるコードが増え、全体的なコストやリスクを回避できるからですね。

~~~ :Objective-C
- (BOOL)isOS10Handler:(void (^)(void))iOSHandler otherHandler:(void (^)(void))otherHandler {
    BOOL isOS10 = NO;
    if ( floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max ) {
        // iOS10以降の場合
        if (iOSHandler) {
            iOSHandler();
        }
        isOS10 = YES;
    } else {
        // iOS9以前の場合
        if (otherHandler) {
            otherHandler();
        }
    }
    return isOS10;
}
~~~
上記のように、好みにもよりますが上記のハンドリングを用いておけば、判定と変更もメソッド内で個別に対応が出来たりします。

> レイアウト調整の場合においてもですが、切り替える際にコードで書かなくてはならない時はこちらが便利です。
ブロック構文に関しては別の時に学んでいきます。


iOSのバージョンによって異なるデザイン（iOS7以前）やiOS10から変わったウィジェットの背景色などを調整したりする際にこの判定処理が使えます。
以下がその例です。

###### Objective-C 切り替える場合 の 例

~~~ :Objective-C
if ( floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max ) {
    // iOS10以降の場合
} else {
    // iOS9以前の場合
}
~~~

iOS10以降の場合

~~~ :Objective-C
if (@available(iOS 13.0, *)) {
    // iOS13以降の場合
} else {
    // iOS13未満の場合
}
~~~

iOS１3以降とiOS12以前の場合で切り替えることが可能です。
特に、Popoverの時などのレイアウト変更の時はよく使いました。
こちらの苦労話は、またどこかで書きたいと思います。

###### Swift 切り替える場合 の 例

~~~ :Swift
if floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max {
    // iOS10以降の場合
} else {
    // iOS9以前の場合
}
~~~

iOS10以降の場合

~~~ :Swift
if #available(iOS 10.0, *) {
    // iOS10以降の場合
} else {
    // iOS9以前の場合
}
~~~
参考：[iOS 7 UI Transition Guide](https://developer.apple.com/jp/documentation/#//apple_ref/doc/uid/TP40013174-CH14-SW3)


## 関連記事
- [ ] マクロの書き方 
- [ ] Popover
- [ ] ブロック構文
- [ ] バーションアップ
- [ ] Objective-C 一覧
- [ ] Swfit 一覧
【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

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

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

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

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

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集