Unity

【Unity×iOS】ネイティブ機能でユーザーのOSバージョンを取得する | SystemInfo.operatingSystem

この記事について

UnityでiOSアプリを開発するとき、ユーザーが使っているOSバージョンを正しく取得できるかは重要なポイントです。
標準の SystemInfo.operatingSystem だけでは不十分で、ネイティブコードと連携する必要が出てきます。

この記事で分かること

  • Unity標準のSystemInfo.operatingSystemでは何が足りないのか
  • iOSで正確なバージョンを取得する方法(ネイティブ)
  • Objective-C++プラグイン+Unity連携
  • OSバージョンに応じた処理分岐の実装例

ユーザーのiOSバージョンとは?

ここで言う「ユーザーのiOSバージョン」とは、アプリを利用している端末にインストールされている OSのバージョン番号 のことです。
例えば、16.4 や 17.0.1 のように「メジャー・マイナー・パッチ番号」で構成されています。

この情報は、アプリ開発や運用の現場でとても重要です。なぜなら iOS はアップデートによって挙動や仕様が変わるため、ユーザーがどのOSを使っているかによって動作確認や機能制御を切り替える必要があるからです。

iOSバージョンを把握することでできること

  • 互換性チェック
    → 新しいiOSで仕様変更があっても、古い端末では問題なく動作するかを確認できる。
  • 機能制限や条件分岐
    → 例:「iOS 16以上ならこの機能をON、それ未満はOFF」など。
  • バグ調査・ログ収集
    → クラッシュや不具合が「特定のiOSバージョン」でのみ発生しているかを分析できる。

OSのバージョンを取得する

Unity標準のSystemInfo.operatingSystemの限界

Unityには、OS情報を取得するための標準プロパティ

SystemInfo.operatingSystem

がありますが、これはあくまで”iPhone OS 16.4″ のような文字列であり、

  • 直接バージョン番号を比較できない
  • OS名やデバイス名が混ざっていて処理が面倒

という弱点があります。
※後にネイティブ機能と比較します。

iOSのOSバージョンをネイティブ機能で取得する

iOSネイティブでは、[[UIDevice currentDevice] systemVersion] を使うことで
“16.4.1” のようなバージョン番号の文字列を取得できます。
これをUnityに渡してあげれば、バージョン比較も簡単に行えるようになります!

OSバージョン取得プラグインの手順

.mmファイルを作成する

「Assets/Plugins/iOS」のフォルダにOSVersionPlugin.mmを作成し保存する。
※「.mm」ファイルは投稿者はメモ帳で作成

#import <UIKit/UIKit.h>

extern "C" const char* GetiOSVersion()
{
    NSString* version = [[UIDevice currentDevice] systemVersion];
    return [version UTF8String];
}

Unity側のC#スクリプト

using TMPro;
using UnityEngine;

public class Get_OSVersion : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI versionText;

    void Start()
    {
        // ネイティブから取得したOSバージョン
        string osVersionNative;

        // UnityのSystemInfoから取得したOS情報
        string osVersionUnity = SystemInfo.operatingSystem;

#if UNITY_IOS && !UNITY_EDITOR
        osVersionNative = OSVersionPlugin.VersionString;
#else
        osVersionNative = "";
#endif

        // TextMeshProに両方表示
        versionText.text =
            "iOS Version (Native): " + osVersionNative + "\n" +
            "OS (SystemInfo): " + osVersionUnity;
    }
}

ネイティブ機能とSystemInfo.operatingSystemの比較

ここまでで2つバージョン情報を出す方法がわかったので、実機で動かし検証していきます。

実行してみると、ネイティブ機能はバージョン情報のみSystemInfo.operatingSystemは「iOS」という不要な文字列も含まれていますね。

活用場所

  • 特定のOS未満では機能制限・警告表示
  • 古い端末に軽量モードを自動適用
  • バグ報告でOSバージョンも記録して再現性を調査
  • iOSアップデートの対応調査として内部ログ送信に使う

まとめ

  • Unity標準の SystemInfo.operatingSystem は情報取得はできるが、数値比較には不向き
  • iOSネイティブの systemVersion を呼べば「16.4.1」のように直接扱いやすい値が得られる
  • プラグインを作ればUnityから簡単に利用可能
  • 実務では OSバージョン条件分岐・ログ収集・互換性調査 に大きく役立つ