Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法

2019年9月にリリースされた Xcode11 では、新しい iOS 13 に対応しています。

新しい環境向けにアプリケーションを開発するときには新機能満載で実装するのも良いですが、ときには以前のバージョンの iOS 向けにもアプリケーションを開発する必要がある場合もあるでしょう。

ここでは Xcode11 で iOS12.x 以前の環境向けにアプリケーションを開発するときの初期設定について説明します。

プロジェクトを作成してすぐ後にする作業として説明しています。既に記述したコードがある場合は、単純に当てはまりません。 書いたコードを誤って消さないように注意してください。

Xcode11 でターゲットを 12.x にするとビルドできない!

Xcode11 で iOS プロジェクトを作成すると、デフォルトの開発ターゲットは iOS13 になっています。

開発ターゲットを確認するには、プロジェクト・ナビゲータを開き、プロジェクトツリーの一番上のプロジェクトを選択しします。 右側のペインで General の中の Develoyment Info 内の Target から確認できます。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 10

iOS 13 より前のバージョン、例えば iOS 12.4 の環境にインストール可能な (デプロイ可能な) アプリケーションを作成するには、ここで 12.4 を選択します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 2

iPhone 6 以前のバージョンの iPhone は iOS 13 に対応していません。

このままビルドしようとしても、たくさんエラーがでてしまい、ビルドは失敗します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 9

iOS 12.4 に対応するにはどうしたらよいでしょうか。

ターゲットの変更とビルド方法

2-1. ビルドの前提 - Storyboard を使う

まず iOS 12 以前のバージョン向けにビルドするための前提は、SwiftUI を使わないということです。

Xcode 11 から UI の開発に SwiftUI が利用できるようになりましたが、そもそも SwiftUI 自体が iOS13+ 向けとなっています。 このため、SwiftUI ではなく Storyboard を使います。

Xcode の新規プロジェクトの作成ウィザードでは、User Interface の設定は Storyboard を選択しましょう。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 8

プロジェクトの設定の Deployment Info にて、Target の設定で 12.4 を選択します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 2

2-2. @available 属性の設定による方法

この状態でビルドすると、たくさんエラーが発生してしまいビルドできません。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 9

ここでよく見ると、ワーニング中に @available 属性を設定するように促されています。このサジェッションに従って、@available 属性を設定しましょう。

イシュー・ナビゲータ内のエラー項目をクリックすると、エラー発生箇所にナビゲートされます。

ポップアップ内に表示されている Fix をクリックすると、自動的に @available 属性が設定されます。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 3

もしポップアップが表示されていない場合は、赤い丸のアイコンをクリックすると、ポップアップが開きます。

これで iOS 13 以降の場合に使える機能であることがマークされます。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 4

この作業を、イシュー・ナビゲータに表示されたエラー項目それぞれに対して行います。ひたすら Fix を押していくだけなので簡単です。

さて、エラーがなくなったところで、アプリケーションを起動してみましょう。実はこの状態ではまだ、実行時にエラーが発生してしまいます。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 5

ファイル AppDelegate.swift を開いて、次の行を追加します。

var window: UIWindow?

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 6

これで正常にビルドでき起動するはずです。

2-3. コードの削除による方法

上の方法は Xcode のサジェッション通りなので、お行儀が良いようにみえます。

しかし、特に iOS13 向けの機能を実装しているわけでもないのなら、無駄に新しい OS 向けのコードを残しておく必要はありません。

そこで、新しく導入された部分を削除して、iOS12 以前に対応する方法も書いておきます。

まず Info.plist から Application Scene Manifest のエントリーを削除 します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 7

次に SceneDelegate.swift を削除 します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 7

次に AppDelegate.swift// MARK: UISceneSession Lifecycleのファンクションを削除 します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 7

最後に、同じくAppDelegate.swiftwindow を追加 します。

Xcode11 で iOS 12 以前をターゲッドにしてビルドする方法 7

AppDelegate.swift は次のようになります。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

}

これで iOS 12 の環境で実行できるはずです。

以上、ここでは Xcode 11 で iOS 13 より前のバージョン向けに、アプリケーションを開発するときのプロジェクトの初期設定方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門