Xcode12でSwiftUIを選択するとiOS14以降のアプリしか作成できない

目次

概要

Xcodeで新しくiOSアプリを作ろうとしたら、最低要件がiOS14以降のアプリのコードが生成されて困りました。

そこで、ここでは私がこの問題を解決した方法を紹介します。

環境

  • mac mini 2018
  • macOS Big Sur 11.2
  • Xcode 12

SwiftUIのバージョン

SwiftUIは、比較的新しいUIに関するフレームワークです。そのため、進化も激しいです。

2021年の2月時点でSwiftUIのバージョンは2となっているのですが、これはiOS14移行にしか対応していません。

実はこれが、Xcodeで新しくプロジェクトを作成したときにiOS14以降にしか対応しない理由となっています。

しかし、逆をいうならばSwiftUIのバージョン1を使うようにすれば、この問題は解決しiOS13以降に対応するということでもあります。

ちなみに、SwiftUIはiOS13以降にしか対応していないためiOS12以下のバージョンに対応する場合はSwiftUIを使うことができません。

プロジェクトの作成時に対応

iOS13以降に対応する方法として、プロジェクトの作成時から対応させる方法について最初に紹介します。

プロジェクトの作成時から対応させる場合は、次のような画面のときに、LifeCycle > UIKit App Delegateと選択します。

normal_5e10d463-223b-40f7-a51d-8a2c4060af1f.png

これは、UIKit App Delegateの書き方が、SwiftUI2より簡潔に書けるようになったのですが、SwiftUI1には対応していないためIOS13に対応するコードを作成するようにしているということです。

これで、iOS13以降に対応するプロジェクトを作成出来ました。

既存のプロジェクトの対応

既存のプロジェクトで、後からやっぱりiOS13以降に対応しておきたいということがあるかもしれません。

そのようなときは、次のようにAppDelegate.swiftという名前で、次のようなコードを追加します。

import SwiftUI
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        window!.rootViewController = UIHostingController(rootView: ContentView())
        window!.makeKeyAndVisible()

        return true
    }
}

AppDelegateクラスでは、applicationメソッドで最初に表示する画面の設定をしています。

ここでは、ContentViewという名前で用意した画面を表示します。

その後、プロジェクト名と同じ名前で作成されているSwiftファイルがあるはずなので、それを削除します。

これで、既存のプロジェクトへもiOS13以降の対応が出来ました。

まとめ

SwiftUIを使ってみると、かなり使いやすく良いのですが、複雑なことをやりたいプロジェクトへの導入や、古いバージョンへの対応を考えるようなときには、少し考える必要があるのかなと思います。

また、今回プロジェクトの設定ファイルからiOS13への対応を行うためにターゲットとなるiOSバージョンを変更する必要があるのですが、そこの部分の説明は省いています。

設定ファイルから、変更するだけなので、各自調べてやってみてください。