01 まず判定すること
Appleは、iOS 27.0 SDKでビルドしたUIKitアプリについて、UISceneを基盤とするライフサイクルを起動条件にすると説明しています。対象のSDKでビルドする予定なら、iOS 27 UIScene移行をすぐに始めてください。旧SDKの利用は短期回退に限定し、本番公開前は旧ツールチェーンを残したまま、別のMacで新旧の起動、深いリンク、前後切り替え、Archiveを二重に検証します。詳しい境界はApple Developer ForumsのSDK適用条件に関する説明で確認できます。
最終更新:2026年9月14日。 Xcode 27 RCの公開記録、Xcode 27 Release Notes、App Store Connectの公開情報、Apple公式のUIScene移行資料を照合しています。正式版や新しい提出期限が公開された場合は、判定を再確認してください。
この手順が必要な人
AppDelegateでUIWindowを作り、Scene Manifestをまだ設定していない既存UIKitアプリが対象です。Storyboard、純コード、混在構成のいずれでも、ライフサイクルの責務をどこへ移すか判断できます。
本番用のMacが一台しかなく、Xcode 27を直接切り替えるとリリース作業が止まる小規模チームにも向いています。
02 SDKと最終成果物による対象判定
iOS 27 UIScene移行の要否は、端末のOSバージョンだけでは判断できません。見るべきなのは、Xcode 27で作成した最終ArchiveにどのSDKの情報とInfo.plistが入っているかです。
AppleのUIKitライフサイクル移行ガイドでは、Scene Manifest、シーン接続、ウィンドウ管理を段階的に確認できます。次の条件で作業方針を分けてください。
- iOS 27 SDKでBuild、Test、Archiveを行う
UIScene移行を実施します。旧AppDelegateの画面生成だけを残したまま、起動確認へ進めてはいけません。 - 近いリリースで新SDKを使うが、移行が未完了である
旧Xcodeの検証済み環境を回退先として保管し、移行用ブランチと新しい検証環境を分離します。 - 当面は旧SDKだけで社内確認する
一時的な回退にはできますが、将来の提出条件を満たしたことにはなりません。締切を推測せず、公式の要件更新を確認しながら移行計画を残します。
確認対象はUIApplicationSceneManifestだけではありません。application(_:configurationForConnecting:options:)が有効な構成を返すか、Storyboard名とシーン設定が一致するか、最終Archiveに意図した設定が入っているかを確認します。
03 プロジェクト構成別の移行境界
Storyboard構成
Storyboardを使うアプリでは、画面の生成場所を二重にしないことが重要です。Scene Manifestで対象のStoryboardを関連付ける場合、SceneDelegateで同じ画面を再生成すると、空白画面や意図しないrootViewControllerの上書きが起きます。
AppDelegateにはサービス初期化、共有設定、依存関係の準備を残します。画面の接続、表示状態、シーン単位の復元はSceneDelegate側へ寄せます。Appleのシーン構成に関する公式資料と、実際のArchive内Info.plistを突き合わせてください。
純コード構成
純コードのUIKitアプリでは、scene(_:willConnectTo:options:)の中で次の関係を明示します。
- 接続された
UIWindowSceneを取得する。 - そのシーンを使って
UIWindowを生成する。 rootViewControllerを設定する。makeKeyAndVisible()を呼び出す。- SceneDelegateがwindowを保持する。
古いコードがAppDelegate.window、グローバルなkeyWindow、固定した画面番号からUIを探していないか確認します。複数シーンに対応しない場合でも、現在の画面を単一のグローバル参照に固定すると、再接続や外部ディスプレイで誤ったウィンドウを参照しやすくなります。
混在構成と既存サービス
UIKitの画面はSceneDelegateへ移しても、分析、認証、データベース、プッシュ通知登録まで一括移動する必要はありません。プロセス全体に一度だけ必要な初期化と、シーンごとに必要な初期化を分けます。
Xcode 27へ移行する前に、AppDelegateの各メソッドを一覧化してください。画面生成、URL処理、通知処理、共有状態の変更を色分けすると、移動による副作用を追跡できます。
| 確認対象 | AppDelegateに残す候補 | SceneDelegateへ移す候補 | 失敗時の症状 |
|---|---|---|---|
| プロセス初期化 | 共有サービス、設定読込 | 画面に依存しない初期化は残す | 二重初期化、ログイン状態の不整合 |
| ウィンドウ | 原則として直接生成しない | UIWindowScene、window、rootViewController | 黒画面、別シーンの表示 |
| URL | プロセス共通の受信準備 | 接続時のURL、表示中シーンへの振り分け | 深いリンクの取りこぼし |
| 通知 | 通知登録や共通処理 | 起動・復帰時の画面遷移 | 通知タップ後に目的画面が開かない |
| 状態復元 | 永続データの管理 | シーン単位の表示状態 | 復帰後の画面が初期化される |
04 起動イベントと外部入力の整理
UIScene移行で見落とされやすいのが、アプリのプロセス起動とシーン接続を同じイベントとして扱うことです。コールドスタート、バックグラウンドからの復帰、すでに表示中のシーンでは、入力が届く入口が変わります。
URL、Universal Link、通知応答、ユーザーアクティビティは、接続時のconnectionOptionsから読み取る経路を用意します。AppleのUIScene.ConnectionOptions APIには、URLコンテキストや通知、ユーザーアクティビティを受け取るための情報が整理されています。
第三者のログイン、分析、プッシュ通知SDKがAppDelegateの古いコールバックだけを前提にしていないかも確認します。SDKのバージョン更新だけで解決したと判断せず、脱敏したURLと通知ペイロードで次の経路を個別に確認してください。
- アプリ未起動の状態からURLを開く。
- バックグラウンド中に通知をタップする。
- アプリが表示中に別のURLを開く。
- 認証完了後にアプリへ戻る。
- 同じ入力を二回処理しない。
05 iPad、複数ウィンドウ、Mac Catalyst
UISceneを採用したからといって、直ちに複数ウィンドウ機能を公開する必要はありません。ただし、単一の画面を前提にした可変状態は見直してください。文書型アプリ、Stage Manager、Mac Catalyst、外部ディスプレイでは、シーンの生成と破棄が画面の表示状態に影響します。
特に、共有の編集対象やログイン状態を単一windowのプロパティへ置いている場合は、シーンをまたいだ参照になっていないか確認します。古い外部ディスプレイ用の役割分岐をそのまま残すのではなく、最新のUIScene API資料に照らして、必要な範囲だけ修正してください。
ここで大規模なアーキテクチャ変更まで同時に行うと、起動失敗の原因を追えなくなります。まずシーン接続、ウィンドウ、入力イベント、状態復元を通し、その後に複数ウィンドウ対応を判断します。
06 FAQ:構成別の切り分け
iOS 27 SDKで起動できなくなる判定
iOS 27 SDKでのBuildが起点なら、端末のOSを下げても移行要件の確認を省略できません。最終ArchiveのSDK、Info.plist、Scene Manifestを保存し、旧SDKのArchiveと比較します。コンパイル成功だけでは不十分です。インストール後に実際の起動まで確認してください。
旧AppDelegateからSceneDelegateへ移す範囲
SceneDelegateを追加するだけでは移行完了になりません。windowの生成、rootViewControllerの設定、シーン接続後の状態復元を実装し、AppDelegateに残す処理との境界を決めます。Storyboard構成では、設定ファイルとコードのどちらが画面を生成するかを一つに定めます。
深いリンクとプッシュ通知の入口
起動時に届いた情報と、表示中のシーンへ届いた情報を同じコードパスへ正規化します。接続時はConnectionOptionsを読み、表示中はSceneDelegateの対応メソッドで処理します。通知タップ後に認証画面を経由する場合は、URLを即時破棄せず、認証完了後に再開できる状態として保持します。
旧Xcodeへの回退
旧Xcodeは短期回退用に残せますが、新SDK対応の代替ではありません。既存の本番打ち込み用環境でいきなり切り替えず、移行前のArchive、署名設定、依存関係、起動ログを保存してから新環境を検証します。回退条件は「起動失敗」だけでなく、深いリンク、通知、Archive失敗も含めます。
リモートMacでの二重検証
リモートMacでは、同じ脱敏プロジェクトを旧ツールチェーンとXcode 27で別作業領域へ置きます。移行前後でBuild、Test、Archive、インストール、起動、URL、通知、前後切り替えを実施し、ログと生成物を分けて保存します。接続が切れた後の再接続やホスト再起動後の無人ビルドも確認対象です。
07 Xcode 27の二重検証条件
Xcode 27 RCの公開記録とXcode 27 Release Notesは、Appleのリリース情報および公式Release Notesで確認できます。App Store Connectが受け付けるビルド条件と、アプリの起動条件は同じではないため、アップロード成功だけを合格条件にしないでください。
| 検証段階 | 旧ツールチェーン | Xcode 27環境 | 合格の証拠 |
|---|---|---|---|
| ビルド | 移行前ソースの再現 | 移行後ソースのBuild | 警告とエラーを保存 |
| 起動 | 既存画面が開く | SceneDelegate経由で開く | 起動ログと画面確認 |
| 外部入力 | 既存経路を確認 | URL、通知、認証復帰を確認 | 脱敏入力と結果 |
| 状態変化 | 前後切り替えを確認 | シーン再接続と復元を確認 | 復元結果を記録 |
| Archive | 既存公開手順を維持 | 新SDKで生成 | xcarchiveと署名結果 |
| 回退 | 再現可能な状態を保管 | 不合格時に切り戻す | 切り戻し手順と影響範囲 |
本番用Macを変更する前に、次のチェックを完了させます。
- [ ] 最終ArchiveのSDKとInfo.plistを保存した
- [ ]
UIApplicationSceneManifestの有無と内容を確認した - [ ] Storyboardまたは純コードのwindow生成を一箇所に整理した
- [ ] AppDelegateとSceneDelegateの責務を一覧化した
- [ ] コールドスタートを確認した
- [ ] バックグラウンド復帰を確認した
- [ ] URLとUniversal Linkを確認した
- [ ] 通知タップとログイン復帰を確認した
- [ ] iPadまたはMac Catalystの対象範囲を確認した
- [ ] 旧Archiveと旧Xcodeを回退用に保管した
- [ ] Xcode 27でArchiveを作成し、インストール後に起動した
- [ ] リモート接続の再接続、ホスト再起動、無人ビルドを確認した
08 移行先Macを分ける判断
一台しかない本番MacでXcode 27へ切り替えると、失敗時に署名、依存関係、Archive作成まで同時に止まります。現在の環境には触れず、まず脱敏プロジェクトを別のMacへ置いて、移行前後の成果物を比較する方が安全です。
CALMVPSのMacレンタル環境の案内を確認すれば、Xcode 27の検証用Macを本番機と分離する構成を検討できます。短期間の移行確認なら、利用料金の案内で必要な期間と作業量を照合してください。
ただし、長期間にわたる高負荷の固定ビルド、物理デバイスや専用周辺機器への常時接続が必要な場合は、専用の自所有Macや既存の社内ビルド機の方が適します。逆に、Xcode 27の移行確認、Archive検証、回退手順の作成が目的なら、本番機を止めずに試せるリモートMacの方が作業単位に合わせやすいです。
現在の環境をそのまま更新する方法は、署名設定や依存関係を壊した際に復旧時間が読みにくく、旧Xcodeへ戻す作業も本番ビルドと競合します。CALMVPSのMac利用手続きを使って検証用環境を分離すれば、移行前のArchiveを保持したまま、起動と公開前検証を先に完了できます。合格後にだけ本番のデフォルトXcodeを切り替える、という順序にしてください。