はじめに
この記事では上記のように 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 でシミュレータを選択して実行します
実行後に実行ウィンドウに上記のようなメッセージが出力されていることを確認します
シミュレータが起動してアプリが実行されたら
適当にコードを書き換えてから保存してみます
すると、ホットリロードが行われていることが確認できます