🐾
Main.storyboardの削除作業を自動化する
はじめに
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に協力してもらいながら書きました。
もっと安全な書き方があれば、教えていただけると嬉しいです!
株式会社 カラビナテクノロジーは「命綱や支点を素早く確実に繋ぐカラビナ。そんなカラビナのような役割をテクノロジーで実現したい」という想いのもと、福岡で設立。 主にシステム開発・アプリ開発・ Webサイト制作を行っています。採用情報→karabiner.tech/recruit/requirements/
Discussion