iOS

[오픈소스] Inject

Phililip
728x90

안녕하세요.

 

이번에는 UIKit, AppKit, SwiftUI 상관없이 Hot reloading을 지원하는 Inject라는 오픈소스에 대해 알아볼게요.

 

전체 프로젝트는 여기에 올려두었어요.

 


# 1. Hot reloading?

우선 Hot reloading이란 무엇인지 알아야겠죠??

 

Hot reloading이란 소스코드가 변경되었을 때 앱 종료/재실행하는 것처럼 다시 컴파일하는 것이 아닌 실시간으로 실행 중인 앱에 수정내역이 반영되게 하는 기술을 말해요.

(SwiftUI의 프리뷰 같은거라고 보면 될 것 같아요.)

 

앱을 다시 빌드하는데 시간도 줄이고, 앱 재실행하고 내가 원하는 화면으로 이동하는 시간까지 줄일 수 있으니 개발 시간이 매우 단축되겠죠??ㅎㅎㅎ

 

 

 

 

# 2. Inject

즉, Inject를 사용한다는 것은???

 

Inject 오픈소스 사용 -> Hot reloading 지원 -> 빌드 시간 단축 -> 달달하구만...  😎

 

 

사실 이전부터 InjectionIII이란 오픈소스가 존재하고 있었는데요,

 

InjectionIII

 

이번에 소개하는 Inject는 개발자가 더욱 쉽게 사용할 수 있도록 InjectionIII를 wrapping 한 것이라고 보면 됩니다.

 

 

Inject를 사용하면 아래처럼 코드를 수정할 때 실행 중인 앱에서 실시간으로 반영되는 것을 볼 수 있어요.

 

 

 

그렇담... UIKit과 SwiftUI에서 Inject를 직접 사용해볼게요.

 

 

# 3. Inject 사용해보기

## 3.1 Inject 설정

우선 InjectIII를 여기서 최신 버전으로 다운 받아주세요.

 

다운받아서 압축을 풀면 InjectIII.app이란 파일이 있는데, 이 파일을 Application(응용 프로그램) 폴더에 넣어주세요.

 

참고로 Inject를 사용하려면 Xcode의 경로가 /Applications/Xcode.app 이어야 합니다!

 

 

 

# 3.2 UIKit에서 Inject 사용하기

Swift Package를 추가해주세요.

(git : https://github.com/krzysztofzablocki/Inject.git)

 

 

 

 

그리고"Other Linker Flags" Debug 설정에 "-Xlinker -interposable"를 추가해주세요.

 

 

 

InjectIII 프로그램을 실행시키고 Open Project를 눌러서 현재 프로젝트를 추가해주세요.

 

 

 

이제 설정은 끝났습니다!!ㅎㅎㅎ

 

 

사실 사용하는 것도 쉬워요.

 

UIViewController를 화면에 띄울 때 Inject.ViewControllerHost를 통해서 UIViewController를 만들어주기만 하면 됩니다.

let viewController = Inject.ViewControllerHost(YourViewController())  ✅
rootViewController.pushViewController(viewController, animated: true)

 

 

 

 

 

직접 확인해볼까요??

 

참고로 빌드했을 때 콘솔창에 아래 같은 로그가 출력되면 잘 연결된 것이니 꼭 확인해주세요!

💉 InjectionIII connected /Users/Philip/Desktop/Inject-Practice/InjectPractice.xcworkspace
💉 Watching files under /Users/Philip/Desktop/Inject-Practice

 

 

👍 👍 👍

 

 

 

그런데 이런 생각이 들 수도 있어요.

 

"Inject는 개발할 때만 사용하는 것이라서 릴리즈 빌드 때는 필요 없는 것 아님? 그럼 코드 상으로 분기 처리를 해줘야 하나???"

 

 

결론은 신경 쓰지 않아도 된다!!! 입니다.

 

Inject는 릴리즈 빌드일 때는 아무런 동작을 하지 않는다고 해요. 그래서 코드를 굳이 분기 처리를 해줄 필요는 없는 것입니다ㅎㅎ

 

Remember you don't need to remove this code when you are done, it's NO-OP in production builds.

 

 

 

## 3.3 SwiftU에서 Inject 사용하기

UIKit과 동일한 방식으로 Swift Package를 추가한 뒤에 "Other Linker Flags" Debug 설정에 "-Xlinker -interposable"를 추가해주세요.

 

또한, InjectIII 프로그램에서 프로젝트 추가하는 것도 잊지 말아 주세요.

 

 

다음엔 SwiftUI 뷰 안에 아래처럼 Inject.observer 변수를 넣어주고 body 끝 부분에서는 .enableInjection() method를 호출해주세요.

import Inject

struct ContentView: View {
    @ObservedObject private var iO = Inject.observer  ✅
    var body: some View {
        Text("Hello, world!")
            .padding()
            .enableInjection()  ✅
    }
}

 

끝!!!ㅎㅎㅎ

 

 

마찬가지로 빌드했을 때 콘솔에 아래처럼 로그가 찍혀야지 정상인 것입니다.

💉 InjectionIII connected /Users/Philip/Desktop/Inject-Practice/Inject-Practice-SwiftUI/Inject-Practice-SwiftUI.xcodeproj
💉 Watching files under /Users/Philip/Desktop/Inject-Practice/Inject-Practice-SwiftUI

 

 

직접 확인해볼까요???

 

 

👍 👍 👍

 

 

물론 SwiftUI에서도 릴리즈 빌드일 때 Inject가 아무런 동작을 하지 않으니 별도의 분기 처리는 하지 않아도 됩니다.

 

 

 

## 참고

- https://swiftpackageindex.com/krzysztofzablocki/Inject

 

Inject – Swift Package Index

Use this Package×How you add this package to your project depends on what kind of project you're developing.When working with an Xcode project:When working with a Swift Package Manager manifest:1.0.5main

swiftpackageindex.com

 


 

이번 글은 여기서 마무리.

 

 

 

반응형

'iOS' 카테고리의 다른 글

SwiftUI <-> UIKit 이벤트 전달 방법  (0) 2022.05.21
Logger, OSLogPrivacy  (0) 2022.05.02
Notification에 Action 버튼 추가하기  (0) 2022.04.05
[오픈소스] Bagbutik  (0) 2022.03.28
mailto scheme과 기본 메일 앱 설정  (0) 2022.03.23