[iOS 8] NSProcessInfo で iOS のバージョンを判定する

バージョンの判定

iOS でバージョン判定するには今までですと [[UIDevice currentDevice] systemVersion] を使ったり NSFoundationVersionNumber を使ったりしていましたが、iOS 8 の Foundation フレームワークでは NSProcessInfo で簡単に判別できるメソッドが追加されました。次のように記述します。

let systemVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 0)
NSProcessInfo().isOperatingSystemAtLeastVersion(systemVersion) // 8.0.0 で実行している場合はfalse

便利なんですが、当然 iOS 7 以前では利用できません。そのため、iOS 7 以前の判別には結局 [[UIDevice currentDevice] systemVersion]NSFoundationVersionNumber を使う必要があります。

毎回記述するのは面倒なので、これらを上手く使って iOS のバージョンを判別する関数を作りました。

実装する

func greaterThanOrEqual(majorVersion: Int, minorVersion: Int, patchVersion: Int) -> Bool {
    // NSProcessInfo#isOperatingSystemAtLeastVersion による判別
    if NSProcessInfo().respondsToSelector("isOperatingSystemAtLeastVersion:") {
        let version = NSOperatingSystemVersion(majorVersion: majorVersion, minorVersion: minorVersion, patchVersion: patchVersion)
        return NSProcessInfo().isOperatingSystemAtLeastVersion(version)
    }
    // UIDevice#systemVersion による判別
    let targetVarsion = shortedVersionNumber("\(majorVersion).\(minorVersion).\(patchVersion)")
    let systemVersion: String = shortedVersionNumber(UIDevice.currentDevice().systemVersion)
    return systemVersion.compare(targetVarsion, options: .NumericSearch) != NSComparisonResult.OrderedAscending
}

func shortedVersionNumber(version: String) -> String  {
    let suffix = ".0"
    var shortedVersion = version
    while shortedVersion.hasSuffix(suffix) {
        let endIndex = countElements(shortedVersion) - countElements(suffix)
        let range = Range(start:advance(shortedVersion.startIndex, 0), end: advance(shortedVersion.startIndex, endIndex))
        shortedVersion = shortedVersion.substringWithRange(range)
    }
    return shortedVersion;
}

次のように使います。greaterThanOrEqual でメジャーバージョン、マイナーバージョン、パッチバージョンを指定して、指定されたバージョン以上か判別できます。shortedVersionNumber8.0.08.0 などを同一にみなすため .0 を削るような処理を行う関数です。

if greaterThanOrEqual(8, 0, 0) { println("システムバージョン >= iOS 8.0.0") } else { println("システムバージョン < iOS 8.0.0") } [/swift]

まとめ

自分は WKWebView と UIWebView を切り分けるときなどに必要になったので作成しましたが、何かと必要になる処理だと思います。ぜひ参考にしてください。