デバッグ操作のショートカットキー
Cmd + Shift + y | デバッグエリアの表示/非表示を切り替えます。 |
Cmd + Y: | デバッガを起動/停止します。 |
F7 | ステップイン (デバッグ中にコードを一行ずつ実行) します。 |
F8 | ステップアウト (デバッグ中に現在の関数から抜け出す) します。 |
F6 | ステップオーバー (デバッグ中に次の行へ進む) します。 |
Ctrl + Cmd + Y | デバッグ中に処理を続行します (Continue)。 |
Cmd + Shift + D | デバッグナビゲータを表示し、選択したビューをハイライトします。 |
Cmd + 0 | ナビゲーターエリアを表示します。 |
Cmd + Opt + 0: | ユーティリティーエリアを表示します。 |
| Control + Shift + ↑ or ↓ | 複数行同時入力状態に出来ます。 |
| command + option + enter | プレビュー停止(Editorタブ → Canvas) |
ビルド成果物の場所
/Users/<あなたのユーザー名>/Library/Developer/Xcode/DerivedData/
MyProject-gfrfhdhfgdsh/
Build/Products/<Configuration>/
Debug
Release
.app
ビルドクリーン
| ショートカット | Shift + Command + K |
| GUI操作 | Xcode上部 Product >> Clean Build Folder |
アプリケーションのユーザーデフォルト(設定)のリセット
デバッグ実行中にアプリが保存した設定情報(UserDefaults)が原因で問題が発生している場合、これをリセットする必要があります。macOSアプリの場合、ターミナルコマンドを使って実行できます。
- アプリのバンドルID(例:
com.yourname.yourappname)を確認します。これはXcodeプロジェクトのInfo.plistファイルやプロジェクト設定で確認できます。 - Xcodeでアプリのデバッグ実行を停止します。
- ターミナルアプリを開きます。
- 以下のコマンドを実行します。
com.yourname.yourappnameの部分を実際のアプリのバンドルIDに置き換えてください。
|
1 |
defaults delete com.yourname.yourappname |
プレビューリセット
Macターミナルコマンド、下記を全部実行する。
|
1 2 3 4 5 |
xcrun simctl --set previews delete all rm -rf ~/Library/Developer/Xcode/UserData/Previews rm -rf ~/Library/Developer/CoreSimulator/Caches |
プレビュー(#Preview)の仕様(コメントアウトしたのにプレビューが止まらなかった)
その現象は、SwiftUIのプレビュー機能の仕様によるものであり、通常はあなたの書いたプログラムにおけるメモリリークの可能性を示すものではありません。
#Preview マクロ(以前の PreviewProvider)は、Xcodeが提供する特別な開発ツールであり、通常のアプリの実行とは異なるライフサイクルを持っています。
1. 独立した実行プロセス
Xcodeのプレビューキャンバスで表示されるビューは、メインのアプリとは別の独立したプロセスで実行されています。このプロセスは、ビューのコードが変更されるたびに再コンパイルされ、リフレッシュされます。
2. コード変更の検出
#Preview ブロックをコメントアウトした場合、Xcodeは「プレビューを提供するビュー」の定義が消滅したと解釈します。
- 直後の挙動: プレビューキャンバスに表示されていたビューは消えますが、ビューの裏側で動いていた実行プロセス自体がすぐに完全に終了するとは限りません。特に時間がかかる非同期処理(
taskモディファイアなど)が動いていると、そのプロセスはしばらくの間残ることがあります。 .task{}の性質:.task{}モディファイア内の非同期処理は、そのビューのライフサイクル(Viewが画面から消える時)と結びついて自動的にキャンセルされますが、プレビュー環境自体がクリーンアップされるまでにはタイムラグが発生することがあります。
3. 解決策(プレビュー環境の強制終了)
もしバックグラウンドの処理を完全に停止したい場合は、以下の操作でプレビューの実行環境を強制的に終了・リセットできます。
- Xcodeのリスタート: 一番確実な方法です。
- プレビューの一時停止と再開: プレビューキャンバス上部にある「ライブアクティビティ」のボタン(再生/一時停止アイコン)を操作して、プレビューセッションをリセットします。
- SwiftUI Viewファイルの保存: ファイルを保存し直すことで、リフレッシュがトリガーされることがあります。
メモリリークの可能性について
メモリリークは、通常、クラスインスタンス(特にクロージャ内で self をキャプチャする場合)で循環参照が発生したときに、メモリが解放されずに残り続ける現象です。
今回の現象(コメントアウト後に処理が動く)はプレビュー環境の挙動であり、struct であるViewのライフサイクルや**.task の自動キャンセル**といったSwiftUIの基本的な設計が原因であるため、直ちにメモリリークを疑う必要はありません。
もしメモリリークを心配される場合は、アプリをSimulatorや実機で実行し、XcodeのDebug Navigator(または Instruments)でメモリ使用量を監視して確認するのが正しいデバッグ方法です。
シミュレータアプリのメニューからリセットする(一番簡単)
- Xcodeを起動し、メニューバーから “Xcode” > “Open Developer Tool” > “Simulator” を選択してシミュレータを起動します。
- シミュレータアプリが起動したら、シミュレータのメニューバーから “Device” > “Erase All Content and Settings…” を選択します。
- 確認ダイアログが表示されるので、“Erase” をクリックします。
これで、選択したシミュレータのデータ(アプリ、設定、キャッシュなど)がすべて初期化されます。
|
1 2 3 |
//Bash xcrun simctl erase all |
アーカイブ作成
上部タブ Product → Archive
プロジェクト整理
Xcodeの上部ツールバーより「File」->「Open Recent」->「Clear Menu」を選択。これでスタートメニューからプロジェクト名の削除。
Xcodeアンインストール
|
1 2 3 4 5 6 7 8 9 10 11 |
sudo rm -rf /Applications/Xcode.app sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plist sudo rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist sudo rm -rf ~/Library/Caches/com.apple.dt.Xcode sudo rm -rf ~/Library/Application Support/Xcode sudo rm -rf ~/Library/Developer/Xcode sudo rm -rf ~/Library/Developer/CoreSimulator sudo rm -rf /System/Library/Receipts/com.apple.pkg.XcodeExtensionSupport.bom sudo rm -rf /System/Library/Receipts/com.apple.pkg.XcodeExtensionSupport.plist sudo rm -rf /System/Library/Receipts/com.apple.pkg.XcodeSystemResources.bom sudo rm -ff /System/Library/Receipts/com.apple.pkg.XcodeSystemResources.plist |
Xcodeプロビジョニング場所
‘/Users/ユーザー名/Library/MobileDevice/Provisioning Profiles’
Xcode16から↓
~/Library/Developer/Xcode/UserData/Provisioning Profiles/
リソースフォルダをCopy Bundle Resourcesに入れる
ローカライズ、設定した言語をデバッグで確認する方法
Schemeの設定を変更して確認する
デバイス全体の言語設定を変えることなく、デバッグ実行時のみ特定の言語を指定できます。
- Xcode上部のツールバーにあるアプリ名のアイコン(スキーム選択)をクリックし、「Edit Scheme…」を選択します。
- 左サイドバーで 「Run」 が選択されていることを確認し、右側の 「Options」 タブをクリックします。
- 「App Language」 のプルダウンメニューから、テストしたい言語(例:Japanese, Englishなど)を選択します。
- 必要に応じて 「App Region」 も変更し、「Close」を押して閉じます。
- アプリを再度実行(
Command+R)すると、選択した言語で起動します。
自分向けのビルド
✅ 目的:自分専用ビルドを普通にインストールしたい
これはできます。
方法①(最も簡単):Releaseビルドして .app を置く
- Xcodeで Scheme を Release にする
Product > Archive- Organizer から Distribute App
- 「Development」または「Copy App」
- 出てきた
.appを Applications に入れる
これで普通に使えます。
✅ 方法②:Developer ID 署名して配布する(Gatekeeper対策)
自分のMac以外でも開ける形にしたい場合。
手順
- Signing を
Developer ID Applicationにする - Archive → Distribute → Developer ID
すると
- ダブルクリックで開ける
- 「開発元が未確認」になりにくい
✅ 方法③:自分用に notarize までやる(完全にストア外配布)
ストア外配布の最終形です。
- Developer ID署名
- Notarization
- stapler
までやると
App Store以外で配るアプリとして完全体
✅ 方法④:TestFlight的にストアと同じにしたい
macOSは iOS の TestFlight のような仕組みがあります。
App Store Connect にアップロードして
- External TestFlight
- Internal TestFlight
で配布できます。
これが一番「ストア版に近い」です。
❌ 「App StoreからDLしたのと同じ状態」にしたい場合
これは難しいです。
App Store版は特別で:
- App Store署名
- App Storeレシート
- MASサンドボックス
- StoreKit課金情報
を持っています。
Xcodeでコピーしただけのアプリは:
- Development署名
- レシートなし
- Sandboxも違う
になります。
ストア版と同じように
- 同じ保存場所(Application Support / Containers)
- 同じアンインストール手順
- 同じバンドル構成
で動く「自分専用版」を入れたい
重要:保存場所を揃える鍵は「Bundle Identifier」です
macOS のデータ保存場所はアプリ名ではなく
Bundle Identifier(例:com.yourcompany.app)
で決まります。
つまり:
- ストア版と同じ Bundle ID
→ 保存場所も完全に同じ - Bundle ID が違う
→ 保存場所も別物になる
✅ 保存場所の違い
App Store版(Sandboxあり)
|
1 |
~/Library/Containers/com.xxx.app/Data/Library/Application Support/ |
非Sandbox版(普通のmacOSアプリ)
|
1 |
~/Library/Application Support/YourApp/ |
✅ ストア版と「完全に同じ保存場所」にしたいなら
条件①:App Sandbox をONにする
Xcode → Signing & Capabilities
- App Sandbox ✅ ON
これで Containers 配下になります。
条件②:Bundle Identifier をストア版と同じにする
例:
|
1 |
com.gacharisu.myapp |
これを一致させると:
- Application Support
- Containers
- Preferences
- 保存データ
全部同じになります。
⚠️ ただし注意(同時インストール不可)
Bundle ID が同じなら:
- ストア版と自分版は「同じアプリ扱い」
なので
両方同時に入れることはできません
片方を消すと片方も消えます。
✅ アンインストール方法も同じにしたい
App Sandbox を使う場合:
アプリ削除+Container削除
|
1 2 3 4 5 |
/Applications/MyApp.app を削除 + ~/Library/Containers/com.xxx.app/ |
を削除すれば完全アンインストールです。
✅ 自分専用版をストア版と共存させたい場合
Bundle ID を変える必要があります。
例:
- Store版
com.xxx.myapp - Personal版
com.xxx.myapp.personal
この場合保存場所は別になります。
✅ バンドルした素材ファイルは同じ動きになります
これは Bundle ID に関係なく常に:
|
1 |
MyApp.app/Contents/Resources/ |
なので
- 同梱画像
- テンプレート
はストア版と同じです。





コメント