Xcode11とUISceneとUIWindowにまつわるトラブルシュートに追われている。
個別のケースに分解してお届け。
背景
Xcode10で作成したプロジェクトをXcode11で開いた場合と、Xcode11で作成したプロジェクトで UIWindow
の振る舞いが異なった。この違いはプロジェクトがScene Based Lifecycleに対応しているかどうかに左右されることが分かった。
対応
簡単に言うと以下を実施すればよい。
-
AppDelegate
にwindow
を生やす - Info.plistから
Scene
に関する項目を取り除く -
AppDelegate
からScene
に関する項目を取り除く
これにより、iOS13で動かしてもAppDelegateを基本としたアプリのように動作する。(View Hierarchyを見るとUISceneは健在なので、互換性を保っているだけっぽい)
AppDelegate
にwindow
を生やす
Sceneに関連する物事をオミットしたあと、AppDelegateにwindowプロパティが無いとブラックアウトしてしまうので、生やす。
// AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
}
// AppDelegate.h
@interface AppDelegate: UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow *window;
@end
Info.plistからScene
に関する項目を取り除く
Info.plist から [Application Scene Manifest] の項目を取り除く。
ここまでの対応だけだと、iOS13でアプリを実行した場合に表示すべきStoryboardの情報が見つけられずブラックアウトする。
AppDelegate
からScene
に関する項目を取り除く
AppDelegateから、Scene Based Lifecycleに関するメソッドを取り除くことで、オミットが達成される。
具体的には、以下を取り除けば良い。
AppDelegate application:configurationForConnectionSceneSession:
AppDelegate application:didDiscardSceneSessions: