본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Framework를 통해 모듈화 작업하기

by 후르륵짭짭 2022. 11. 27.
728x90
반응형

서울 어느 카페

 

안녕하세요. 후르륵짭짭입니다.

최근에 사내 업무를 진행 중 신규 장기 프로젝트를 진행 중인데,

메인 프로젝트에서는 Build 속도, Indexing 모두 너무 느려져서 빠르게 개발하기 어렵다고 판단!

Framework를 통해 모듈화 작업을 진행하기로 했습니다.

정말 많은 시간을 Research하는데 시간을 사용했고, 아직 100% 만족하지 못하여 StackOverflow에 질문을 올려 기다리는 중 입니다.

Framework를 통해 모듈화 작업을 해보는게 이번이 처음이였기 때문에 부족한 점도 많고 

더 경험해야 할게 많아졌습니다.

 

** Static 프레임워크 VS Dynamic 프레임워크 **

일단 프레임 워크에는 두가지 종류가 있습니다. 

Excute 파일에 소스 코드가 들어 있어 프로젝트의 용량은 증가하지만 Build 타임을 개선 시킬 수 있는 Static

프로젝트 내에 Framework를 Linking 시켜놓아서 용량은 작아지지만 Building 타임에 빌드되어 Build가 느려지는 Dynamic 이 있습니다.

이 외에도 embed와 Do not embed가 있습니다.

Embed는 말 그대로 프로젝트에 해당 Framework를 Linking 시키는 작업입니다.

Do not embed는 프로젝트에 Framework를 Linking 시키지 않는 것이죠. 

그러니 Dynamic Framework는 Linking을 통해 Framework를 찾아가니 Embed를 해줘야하고 

Static은 이미 Excute 파일에 들어가 있으니 Linking 작업을 해줄 필요가 없으니 Do not Embed 해도 잘 작동 합니다.

자세한 설명은 아래 유튜브 영상을 보는 것을 추천합니다.

https://www.youtube.com/watch?v=IqsKGyklmL0&list=LL&index=4&t=2280s&ab_channel=EssentialDeveloper 

 

** 3rd Party Framework 의존성 가지기 **

만약에 생성한 Framework가 3rd Party Framework(RxSwift, Realm 등)에 의존성을 가지고 있다면 

적용하려는 최종 App에도 해당 Framework가 Dynamic Framework 형태로 가지고 있어야합니다.

만약에 최종 App에 Static Framework로 되어 있다면 Linking이 되어 있지 않기 때문에 에러가 발생 합니다.

예를들어 (library not loaded @rpath...., Image not found 등),,,, ㅠㅠ 

https://fomaios.tistory.com/entry/%ED%95%B4%EA%B2%B0%EB%B2%95-%ED%8F%AC%ED%95%A8Undefined-symbolOBJCCLASS

 

[해결법 포함]Undefined symbol:_OBJC_CLASS_$_

안녕하세요 Foma 입니다! 오늘도 어김없이 새로운 에러를 수집하게 되었습니다. 바로 "Undefined symbol:_OBJC_CLASS_$_" 라는 오류였습니다. 정말 아무것도 안건드리고 podfile에 다른 라이브러리를 하나 추

fomaios.tistory.com

 

** Universal Framework로 생성하기 **

Framework를 생성하는 방법 중 XCFramework와 Universal Framework 두가지 방법이 있습니다.

이전에 XCFramework와 Universal Framework 차이에 대해 설명한 적이 있습니다.

https://syshen.medium.com/create-an-ios-universal-framework-148eb130a46c

 

Create an iOS Universal Framework

Our technology is to create a 3D avatar from one single front face photo. Recently, we would like to wrap this technology to let our…

syshen.medium.com

위 블로그는 Universal Framework를 생성하는 방법에 대해 잘 정리한 글 입니다.

일단 Universal Framework는 하나의 Framework에 여러가지 시스템 아키텍처(arm64 , x86 등)을 넣어주는 것 입니다.

현재 M1 , M2 시스템 아키텍처도 나왔지만 Intel mac도 있기 때문에 Xcode에서 시뮬레이터를 빌드하면 

시뮬레이터는 노트북의 시스템 아키텍처를 따라서 시뮬레이터를 실행 시킵니다.

따라서 arm64 , intel 시리즈를 사용하고 있는 개발 부서일 경우, Framework에 두가지 형태를 모두 가지고 있는 Framework가 있어야

아이폰과 시뮬레이터 모두에서 빌드가 가능해 집니다.

https://www.youtube.com/watch?v=OsxzfcUR8GQ&list=LL&index=3&t=187s&ab_channel=iOSCoderAbhimanyuDaspan 

위 유튭 영상을 통해 수동으로 어떻게 Universal Framework를 만들 수 있을지 보면 좋을 것 같습니다.

 

** XCFramework 생성 방법 및 Build Script 꿀 팁 **

https://hururuek-chapchap.tistory.com/216

 

IOS)XCFramework로 통합 Framework Package를 만들어보자

안녕하세요. 후르륵짭짭입니다. 이번에는 Famework를 만드는 방법에 정리하려고 합니다. 사내에서 특정 Opensource를 받아서 저희 것으로 Custom하게 개발해야할 일이 생겼는데, 개발 된 것을 Famework로

hururuek-chapchap.tistory.com

https://anuragajwani.medium.com/how-to-build-universal-ios-frameworks-using-xcframeworks-4c2790cfa623

 

How to build universal iOS frameworks using XCFrameworks

Compiling iOS frameworks for distribution is not a straightforward task. Out of the box Apple offers no option for distributing compiled…

anuragajwani.medium.com

위에 XCFramework를 생성하는 방법에 대해 정리 하였습니다.

그런데 매번 이렇게 터미널로 작업하는거 쉽지 않습니다.

따라서 Xcode 내부에 아래 이미지 처럼 Aggregate를 만들어 주고 

Build Phases에 New Run Script Phase에 Shell Script를 추가 해주면 됩니다.

그럼 다음에 Target을 변경 후 Run을 해주면 지정한 Path에 Framework가 생성 됩니다.

rm -rf "${BUILD_DIR}/build"

xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -configuration "${CONFIGURATION}" -destination 'generic/platform=iOS' -archivePath "${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-device.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES 

xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -configuration "${CONFIGURATION}" -destination 'generic/platform=iOS Simulator' -archivePath "${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-simulator.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES 

xcodebuild -create-xcframework -framework ${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-device.xcarchive/Products/Library/Frameworks/${PROJECT_NAME}.framework -framework ${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-simulator.xcarchive/Products/Library/Frameworks/${PROJECT_NAME}.framework -output ${BUILD_DIR}/build/${PROJECT_NAME}.xcframework

open "${BUILD_DIR}/build"

위와 같이 Buil Script를 작성 해주면 XCFramework가 생성 됩니다.

 

** StackOverFlow에 올린 질문 **

제발 답변 부탁드릴게요 ㅠㅠ 

3rd Party의존성을 가진 Framework에서 Unit Test를 만드는데 발생하는 이슈 :

https://stackoverflow.com/questions/74545098/framework-unit-test-produced-the-following-errors-library-not-loaded-rpath 

 

Framework Unit Test produced the following errors ( library not loaded @rpath.... )

We are developing unit tests for a framework that has dependencies on the 3rd party universal framework (3rd party is not Pod Framework, Other Team send to me). A 3rd party framework is a dynamic

stackoverflow.com

 

XCFramework 내부 소스가 보이게 만드는 방법 :

https://stackoverflow.com/questions/74590076/how-to-make-visible-internal-source-code-of-xcframework

 

How to make visible internal source code of XCFramework

We are developing a framework for work efficiency. The framework has a dependency on RxSwift. So, App has RxSwift in the form of Dynamic Framework. So I created XCFramework. But if I create a frame...

stackoverflow.com

 

** 참고 사이트 ** 

XCFramework Build Library Distribution 을 YES로 설정 안 할 경우 : 

https://developer.apple.com/forums/thread/125646

 

xcframework does not contain inter… | Apple Developer Forums

Turns out that adding BUILD_LIBRARY_FOR_DISTRIBUTION = YES to the end of the xcodebuild command was not enough / not working to produce a framework with the required swiftinterface files. I had to go in the settings for the actual project and manually set

developer.apple.com

Universal Framework를 생성하는데 발생하는 오류 :

https://stackoverflow.com/questions/57964543/xcode-11-gm-error-accessing-build-database-disk-i-o-error

 

Xcode 11 GM - error: accessing build database - disk I/O error

Encountering following error when only building a "Universal Binary Framework" for release distribution. Same project and settings works when building "Non-Universal" scheme in debug or release mod...

stackoverflow.com

https://stackoverflow.com/a/52400113

 

Xcode 10 beta error while building my project?

I updated my Xcode to 10 beta after that when I build I am getting bellow error with build failure.. accessing build database "/Users/n/Library/Developer/Xcode/DerivedData/Build/Intermediates/

stackoverflow.com

https://stackoverflow.com/questions/64022291/ios-14-lipo-error-while-creating-library-for-both-device-and-simulator

 

iOS 14, lipo error while creating library for both device and simulator

We have been using lipo command to create a framework which works on both device and simulator when integrated in other project. following are the build commands used to generate device and simulator

stackoverflow.com

https://stackoverflow.com/questions/60162207/module-was-not-compiled-with-library-evolution-support-using-it-means-binary-co

 

Module was not compiled with library evolution support; using it means binary compatibility for can't be guaranteed

Recently I face this compile time warning for a SDK. Does it means it is not build with the Target setting "Build Libraries for Distribution"?.

stackoverflow.com

 

Cocoapod에 발생한 이슈 :

https://stackoverflow.com/questions/40599454/use-the-inherited-flag-or-remove-the-build-settings-from-the-target-c

 

- Use the `$(inherited)` flag, or - Remove the build settings from the target. CocoaPod Swift3 pod update error

I've been running into a couple of strange errors in terminal when updating cocoapods after updating a Switf2 project to Swift3. Here are the errors: [!] The `MyShowGuide [Debug]` target overrides...

stackoverflow.com

 

기타 :

https://soojin.ro/blog/application-library-test

 

XCTest 소요시간 단축하기 · Soojin Ro

얼마전까지 XCTest를 유닛 테스트와 통합 테스트로만 구분하고 있었는데, 유닛 테스트 또한 런타임 작동 방식에 따라 application test와 library test로 나눌 수 있다는걸 알게 됐다. 둘의 차이점과 쓰임

soojin.ro

 

728x90
반응형

댓글