コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【SwiftUI】AppCode で編集した SwiftUI をシミュレータにホットリロードする方法

はじめに

この記事では上記のように AppCode で編集した SwiftUI を
シミュレータにホットリロードする方法を紹介していきます

検証環境

  • macOS Catalina 10.15.5
  • AppCode 2022.1.2

手順

上記のページから「InjectionIII.app.zip」を入手して .zip を展開し、
「InjectionIII.app」を Applications フォルダに追加してから起動します

ステータスバーに上記のようにアイコンが表示されたら問題ありません

AppCode で「iOS > Application > App」を選択して「次へ」を選択します

以下のように設定して「作成」を押します

項目 内容
Product Name TestApp
Language Swift
Life Cycle SwiftUI App
Interface SwiftUI

プロジェクトが作成されたら ⌘ ; を押します
「プロジェクト設定」が表示されたら「ビルド設定」を選択します

ビルド設定の「Other Linker Flags」を選択して

ウィンドウが表示されたら「+」を押して

-Xlinker -interposable と入力して「OK」を押します

import SwiftUI

@main
struct TestAppApp: App {
    init() {
        #if DEBUG
        var injectionBundlePath = "/Applications/InjectionIII.app/Contents/Resources"
        #if targetEnvironment(macCatalyst)
        injectionBundlePath = "\(injectionBundlePath)/macOSInjection.bundle"
        #elseif os(iOS)
        injectionBundlePath = "\(injectionBundlePath)/iOSInjection.bundle"
        #endif
        Bundle(path: injectionBundlePath)?.load()
        #endif
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

「TestAppApp.swift」を開いて上記のように書き換えます
デフォルトで作成されている TestAppApp 構造体に init() を追加しています

class ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }

    #if DEBUG
    @objc class func injected() {
        let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        windowScene?.windows.first?.rootViewController =
                UIHostingController(rootView: ContentView())
    }
    #endif
}

次に「ContentView.swift」を開いて ContentView_Previews 構造体を
上記のように書き換えます
デフォルトで作成されている ContentView_Previews を
構造体からクラスに変更して injected() を追加しています

コードの書き換えが完了したら

ステータスバーの「InjectionIII.app」のアイコンを選択して
「Open Project」を選択して今回作成した TestApp プロジェクトのフォルダを選択して
「Select Project Directory」を押します

AppCode でシミュレータを選択して実行します

実行後に実行ウィンドウに上記のようなメッセージが出力されていることを確認します

シミュレータが起動してアプリが実行されたら

適当にコードを書き換えてから保存してみます
すると、ホットリロードが行われていることが確認できます

関連記事