🦅

[iOSアプリ開発] プロジェクト新規作成をしたらはじめにやってること(1) SceneDelegateを取り除く

2021/02/04に公開

プロジェクト新規作成をしたらはじめにやってること

こんにちは。今回これが初投稿になります。
iOSアプリ開発のちょっとしたTipsなどを書いていければと思います。

今回は、iOSアプリ(主にiPhone用)の開発を新しく始めたときに、いつもやってるなぁと思うことを短くまとめようと思います。
最初にやってるのは SceneDelegate を消すことです。

SceneDelegateは、1画面に複数の画面を表示するようなiOS13からの仕組みですが、iPhoneアプリだと今のところシーンが活躍するようなアプリを作っておらず、必要な時がくればその時に追加する方針でもいいかなと思い、まずは消しています。

その手順をまとめます。

AppDelegateからSceneの記述を消す

プロジェクト作成時のデフォルトのAppDelegateのソースコードから

  • // MARK: UISceneSession Lifecycle 以降はバッと消してしまう
  • didFinishLaunchingWithOptionsのメソッド内のコメントも消してしまう
  • 無駄な空行も消してしまう
AppDelegte.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

- 
- 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
-       // Override point for customization after application launch.
        return true
    }
- 
-   // MARK: UISceneSession Lifecycle
-
-    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
-        // Called when a new scene session is being created.
-        // Use this method to select a configuration to create the new scene with.
-        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
-    }
-
-    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
-        // Called when the user discards a scene session.
-        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
-        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
-    }
-
-
}

すると、ソースコードはこんな感じになります。

AppDelegte.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
}

AppDelegateにwindowプロパティを足す

デフォルトのソースコードではSceneDelegateに置かれていた UIWindow型のプロパティであるwindowプロパティはAppDelegateに移してしまいます。

AppDelegte.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

+   var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
}

Info.plist から UIApplicationSceneManifest をすべて消す

Info.plistをソースコード表示(Open As > Source Code)をして、UIApplicationSceneManifestの項目を消してしまいます。
もちろん、プロパティリスト表示(Open As > Property List)でも大丈夫です。

Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
:
(省略)
:
- 	<key>UIApplicationSceneManifest</key>
- 	<dict>
- 		<key>UIApplicationSupportsMultipleScenes</key>
- 		<false/>
- 		<key>UISceneConfigurations</key>
- 		<dict>
- 			<key>UIWindowSceneSessionRoleApplication</key>
- 			<array>
- 				<dict>
- 					<key>UISceneConfigurationName</key>
- 					<string>Default Configuration</string>
- 					<key>UISceneDelegateClassName</key>
- 					<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
- 					<key>UISceneStoryboardFile</key>
- 					<string>Main</string>
- 				</dict>
- 			</array>
- 		</dict>
- 	</dict>
:
(省略)
:
</dict>
</plist>

SceneDelegate.swift ファイルを削除する

左ペインのツリーから普通にファイル削除をしてしまいます。

まとめ

プロジェクトを作成したら

  • AppDelegateからSceneの記述を消す
  • AppDelegateにwindowプロパティを足す
  • Info.plist から UIApplicationSceneManifest をすべて消す
  • SceneDelegate.swift ファイルを削除する

という感じで Scene関係のものをプロジェクトから外してやります。
ここまででビルドが通ってアプリが起動すればOKかと思います。

※もちろん、SceneはiPadアプリ開発やアプリの要件によっては必要になってくると思います。必ず消そうと推奨しているものではありません。

他にも色々やることがあるのですが、それはまた別の機会に。

それではまた。

Discussion