-
[iOS] CocoaPods 으로 RIBs 프로젝트 셋팅하기👻 iOS 2020. 12. 29. 15:30
이전에 시도한 Carthage 로 RIBs 셋팅하는건 잠시 중단하고... CocoaPods 으로 RIBs 셋팅을 해보려 합니다.
#2가 있을지 모르겠네요 -_- 하아 너무 힘들었다
2020/12/28 - [👻 iOS] - [iOS] Carthage 로 RIBs 프로젝트 셋팅하기 #1
대충 기본 프로젝트 하나 만들어 주고.
그 다음 pod 초기화를 실행합니다.
> pod init
Podfile 생기는데 여기에 RIBs를 추가해 줍니다.
> cat Podfile # Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'rib-test' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for rib-test pod 'RIBs', '~> 0.9' target 'rib-testTests' do inherit! :search_paths # Pods for testing end target 'rib-testUITests' do # Pods for testing end end
그런데 cocoapods.org 에서 검색 서제스트에 나오는 RIBs 버전은 0.9.1 이네요
최신 버전이 0.9.3 인데, 벌써부터 불안한 기운이...
> pod install Analyzing dependencies Downloading dependencies Installing RIBs (0.9.1) Installing RxSwift (4.5.0) Generating Pods project Integrating client project
설치해 보니 역시 RIBs 는 v0.9.1, RxSwift 는 v4.5.0 이네요
이것도 나중에 버전을 올려보겠습니다.
우선은 잘 되는지 먼저 테스트를...
(프로젝트 셋팅에 이렇게 쫄리는건 carthage 때문인가 봅니다 ㅋㅋ)
일단 프로젝트는 잘 셋팅 되었고 ( 역시 CocoaPods 👍)
RIBs를 사용하기 위한 단계를 진행해 보겠습니다.
튜토리얼은 한번 보긴 했는데 Root를 구성해보는건 첨이네요
더보기RIBs 템플릿 생성
우선 rib template 을 사용하기 위한 tool 이 설치되지 않았다면
github.com/uber/RIBs/wiki/iOS-Tooling 에서 가이드 하는 방법인
install-xcode.template.sh 스크립트를 실행해서 Xcode에 템플릿을 추가해 두어야 합니다.
1. Root RIBs 생성
iOS target root에 RIBs 그룹을 만들고, 하위에 Root 를 만들어 줍니다.
RIBs 템플릿을 이용해서 ViewController 포함 4개의 파일을 생성합니다.
2. storyboard 제거
쓸모없는 Main.storyboard 파일은 지워주고요
rib-test target의 main interface 에서도 설정된 스토리보드를 해제해 줍니다.
3. SceneDelegate 에 연결
import UIKit import RIBs class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) self.window = window let launchRouter = RootBuilder(dependency: AppComponent()).build() self.launchRouter = launchRouter launchRouter.launch(from: window) } .... // MARK: - Private private var launchRouter: LaunchRouting? }
가만보니 의존성 AppComponent 가 필요하네요
기존 RIBs 튜토리얼에서 그대로 가져와 줍니다.
그리고 물론 안 되겠지만 빌드실행~🎵
응 안돼.
근데 Xcode에서 RIBs 내부에 구문 변환을 요구하네요
아무래도 RIBs 버전 문제인거 같아요.
최신은 0.9.3 이니 이걸 올려보는 방향으로 하겠습니다.
아래와 같이 Podfile 설정을 바꾸고 일단 올려봅니다.
pod 'RIBs', :git => 'https://github.com/uber/RIBs', :commit => 'ffc489f00db785c8c0051678393f7aba0d52f1a4'
> pod install Analyzing dependencies Pre-downloading: `RIBs` from `https://github.com/uber/RIBs`, commit `ffc489f00db785c8c0051678393f7aba0d52f1a4` Downloading dependencies Installing RIBs 0.9.3 (was 0.9.1) Installing RxRelay (5.1.1) Installing RxSwift 5.1.1 (was 4.5.0 and source changed to `https://cdn.cocoapods.org/` from `trunk`) Generating Pods project Integrating client project Pod installation complete! There is 1 dependency from the Podfile and 3 total pods installed.
RxSwift로 5.1.1 로 바뀌었네요.
그리고 빌드!
응 안돼.
당연하게도 Root용은 좀 다르게 구성해야 하는데 템플릿으로 생성하고 그냥 넘어왔네요
이제 Root를 고쳐보겠습니다.
4. Root RIBs 수정
기본적으론 AppDelegate 에선 LaunchRouting 을 요구하고, build 시엔 별다른 listener 를 넣지 않는 것으로 되어 있어요.
요구에 맞춰 바꾸줍니다.
protocol RootBuildable: Buildable { func build() -> LaunchRouting } final class RootBuilder: Builder<RootDependency>, RootBuildable { override init(dependency: RootDependency) { super.init(dependency: dependency) } func build() -> LaunchRouting { let component = RootComponent(dependency: dependency) let viewController = RootViewController() let interactor = RootInteractor(presenter: viewController) return RootRouter(interactor: interactor, viewController: viewController) } }
final class RootRouter: LaunchRouter<RootInteractable, RootViewControllable>, RootRouting { // TODO: Constructor inject child builder protocols to allow building children. override init(interactor: RootInteractable, viewController: RootViewControllable) { super.init(interactor: interactor, viewController: viewController) interactor.router = self } }
final class RootViewController: UIViewController, RootPresentable, RootViewControllable { weak var listener: RootPresentableListener? override func viewDidLoad() { self.view.backgroundColor = .yellow } }
그리고 빌드 가랏!
Carthage는 힘겹게 진행했는데
CocoaPods는 너무 쉽게 되어서 허탈하네요
run 해봅니다.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle </Users/maart/Library/Developer/CoreSimulator/Devices/24EB1FAA-C207-40BD-944C-9A07B3CCCB32/data/Containers/Bundle/Application/F8A7AE5E-C1A6-4453-93DF-4111B13EC383/rib-test.app> (loaded)'
쉽게 좀 갑시다 거... 역시 말은 쉽게 뱉는게 아니었어요.
Main.storyboard 를 찾는 것을 보니 제가 2번 단계에서 제대로 전환을 못한것 같아요.
다시 신발끈 질끈 묶고 돌아갑니다.
5. storyboard 다시 제거
2번 단계에서는 단순히 Main.storyboard 파일을 삭제하고, rib-test target > General > Main interface 에 'Main' 을 빈 값으로만 셋팅하기만 했는데, Scene 이란게 생기면서 설정이 또 추가된 모양이네요. 아래의 경로에 Storyboard Name row를 ⊖ 버튼을 눌러 삭제합니다.
이렇게 하면 원하는 Root RIBs 설정이 완료 됩니다.
배경색을 .yellow 로 했으니 아래와 같은 화면이 나오게 됩니다.
다시 swift 적응도 하기전에 난관이 많네요 ㅠㅠ
다음엔 다른 RIBs를 붙여보도록 할께요