🐾

Main.storyboardの削除作業を自動化する

2023/05/27に公開

はじめに

Main.storyboardの削除作業をシェルで自動化してみました。

(補足)
かなり無理やりな実装をしている箇所があります。
最後の注意事項を読んでから実行してください。

実装方針

  • Main.storyboardを削除
  • プロジェクトファイルを編集し、Xcodeからの参照を消す
  • Info.plistを修正する
  • SceneDelegateで初期画面を設定する

実装

#!/bin/bash

# Main.storyboardを削除
current_dir=$(basename "$(pwd)")
cd $current_dir/Base.lproj
rm Main.storyboard

# Info.plistの修正
cd ../
sed -i '' '/<key>UISceneStoryboardFile<\/key>/d' Info.plist
sed -i '' '/<string>Main<\/string>/d' Info.plist

# プロジェクトファイルの修正
cd ../
cd $current_dir.xcodeproj

projfile="project.pbxproj"
start_pattern="\/\* Main\.storyboard \*\/ = {"
start=$(grep -n "$start_pattern" "$projfile" | cut -d ":" -f1)
sed -i '' "${start},/};/d" $projfile

sed -i '' "/Main.storyboard/d" $projfile

sed -i '' '/INFOPLIST_KEY_UIMainStoryboardFile = Main;/d' $projfile

# SceneDelegate.swiftに初期画面を設定する
cd ../
cd $current_dir

target="guard let scene = (scene as? UIWindowScene) else { return }\n\t\tlet window = UIWindow(windowScene: scene)\n\t\twindow.rootViewController = ViewController()\n\t\twindow.makeKeyAndVisible()\n\t\tself.window = window"
sed -i "" "s/guard let _ = (scene as? UIWindowScene) else { return }/${target}/" "SceneDelegate.swift"

Main.storyboardの削除

これは簡単でrmコマンドを実行するだけです。

rm Main.storyboard

Info.plistの修正

Info.plistから<key>UISceneStoryboardFile</key><string>Main</string>を削除しています。

sed -i '' '/<key>UISceneStoryboardFile<\/key>/d' Info.plist
sed -i '' '/<string>Main<\/string>/d' Info.plist

プロジェクトファイルの修正

プロジェクトファイル内に下記のようなブロックがあり、
/* Main.storyboard */ = {を含む行から};までを削除するようにしました。

C663F1DB2A2061800010DCF8 /* Main.storyboard */ = {
    isa = PBXVariantGroup;
    children = (
        C663F1DC2A2061800010DCF8 /* Base */,
    );
    name = Main.storyboard;
    sourceTree = "<group>";
};
projfile="project.pbxproj"
start_pattern="\/\* Main\.storyboard \*\/ = {"
start=$(grep -n "$start_pattern" "$projfile" | cut -d ":" -f1)
sed -i '' "${start},/};/d" $projfile

他にもMain.storyboard関連の行があるので、削除します。

sed -i '' "/Main.storyboard/d" $projfile
sed -i '' '/INFOPLIST_KEY_UIMainStoryboardFile = Main;/d' $projfile

初期画面の設定

ScheneDelegateにguard let _ = (scene as? UIWindowScene) else { return }があるのでそれを初期画面を設定するコードに置換します。

target="guard let scene = (scene as? UIWindowScene) else { return }\n\t\tlet window = UIWindow(windowScene: scene)\n\t\twindow.rootViewController = ViewController()\n\t\twindow.makeKeyAndVisible()\n\t\tself.window = window"
sed -i "" "s/guard let _ = (scene as? UIWindowScene) else { return }/${target}/" "SceneDelegate.swift"

(インデントを揃えるためにタブを2回挿入していますが、人によっては1回でいいかもしれません。)

実行方法

  • シェルをどこかに保存
    • 例: ~/Shell/kill_main_sb.sh
  • プロジェクトのディレクトリに移動
  • sh ~/Shell/kill_main_sb.sh

このあたりを参考に、コマンド化させておくと便利です。

注意点

  • プロジェクトを作成した直後に実行してください。
  • Xcodeで色々操作した後だと、プロジェクトファイルの操作で失敗する可能性があります。
  • Xcodeバージョン変更によって、このスクリプトでは動かなくなる可能性があります。
    • 14.2, 14.3では動きました。

最後に

ChatGPTに協力してもらいながら書きました。
もっと安全な書き方があれば、教えていただけると嬉しいです!

GitHubで編集を提案
カラビナテクノロジー デベロッパーブログ

Discussion