はじめに
毎年、iOSとAndroidのOSバージョンアップに伴い、モバイルアプリ開発者として対応が必要になりますが、あらためてなぜ必要か整理しました。
対応が必要な理由
古いOSバージョンが対象の場合、アップデートや新規リリースできなくなるからです。
端的にいうと、GoogleやAppleが古いOSバージョンを対象にしているアプリを許さないからです。
- ストアへの新規提出・アップデートの禁止
毎年特定の時期(秋〜冬頃)を過ぎると、最新のOSバージョンを対象として、ビルドされていないアプリは、ストアの審査自体が拒否されます。 - ストアの検索結果からの除外(Android)
放置されている過去のアプリでも、ユーザーのスマホOSより2世代以上古いOSバージョンを対象としていると、Playストアの検索結果に表示されなくなり、新規ダウンロードができなくなります。
どうすればいいのか?
iOS
XCodeのバージョンを対象のOSバージョンを対象としているバージョンにあげる
Android
build.gradleにあるtargetSdkとcompileSdkを対象のOSバージョンを対象としているバージョンにあげる
Flutter
上記のXCodeと、targetSdkとcompileSdkに対応したバージョンにあげる
なぜバージョンを上げないといけないのか?
iOS
iOSの方は、XCodeと対象のiOSバージョンが紐づいているので、新しいiOSバージョンを対象にするためには、対象のiOSバージョンをターゲットにしているXCodeのバージョンを使用して、ビルドしないといけない
どのXCodeのバージョンがどのiOSバージョンをターゲットにしているかは下記で確認できる
SDKという書いてあるところが対象のiOSバージョンである
Android
Androidの方は、targetSdkとcompileSdkのバージョンによって、どのAndroid OSのバージョンが対象か決まる。
以下に記載がある。
Androidビルドにおける「3つのSDK」の違い
Androidのビルド設定(build.gradle)には、主に3つのSDKバージョンが存在します。それぞれの役割がごっちゃになるので整理しておきます。
- minSdk
アプリが動作する一番古いOSバージョン。これより古いOSの端末にはインストールすらできません。 - compileSdk
アプリをビルド(コンパイル)する際に使用するSDKのバージョン。開発者がコード上で「どの最新機能(API)まで使えるか」を決定します。 - targetSdk
アプリが動作を最適化し、テストを完了している目標のOSバージョン。どのOSバージョンのルールに従って動くのかという宣言です。
targetSdkについて
targetSdk は、Androidシステムに対して「このアプリは、Android 〇〇の仕様(ルール)に合わせて作られています!」と宣言する設定です。
Androidは、アプリの targetSdk を見て挙動を変えます。
- 端末のOSが最新(例: 15)でも、アプリの targetSdk が古い(例: 14)場合
- OSは「このアプリは古い時代に作られたんだな」と判断し、特別に古いOS風の挙動(互換モード)で大目に見て動かしてくれます
- targetSdk を 35 (Android 15) に上げたとき、Android 14の端末ではどうなる?
よくある疑問として、「targetSdkを最新に上げたら、古いOSの端末で動かなくなるのでは?」という不安があります。
結論から言うと、古いOSの端末でも問題なく動きます。
Androidのシステムは、「端末のOSバージョン」と「アプリのtargetSdk」を比較して、適用するルールを自動で判断します。
※基本的には compileSdk ≧ targetSdk という絶対ルールがあるため、通常はこれらを同じ最新バージョンに揃えて設定するのがベストプラクティスです。
Flutter
iOSのXCodeのバージョンアップと、AndroidのtargetSdkとcompileSdkのバージョンアップに対応するため、Flutterのバージョンも上げる必要がある。
以下にサポートしているOSバージョンが載っている。