기존 iOS 앱이 있고 테스트하기 쉽도록 다른 프로젝트로 개발 한 코드 덩어리를 추가하고 싶습니다. 새로운 청크는 기본적으로 다양한 공유 서비스 등에 이미지를 저장합니다. 공유 코드에는 많은 테스트와 향후 업데이트가 필요하기 때문에 해당 코드 청크를 기존 앱에 통합하는 가장 좋은 방법이 궁금합니다.
정적 라이브러리, 동적 라이브러리 또는 프레임 워크인지 여부를 모르겠으며 솔직히 차이점이 무엇인지, 어떻게해야하고 Xcode에서 어떻게 설정해야하는지 잘 모르겠습니다.
내가 아는 것은 공유 코드에 대한 별도의 테스트 및 업데이트 응용 프로그램을 유지하고 기본 응용 프로그램에서 사용하도록해야한다는 것입니다.
답변
먼저 몇 가지 일반적인 정의 (iOS에만 해당) :
정적 라이브러리 -컴파일 타임에 링크 된 코드 단위로 변경되지 않습니다.
그러나 iOS 정적 라이브러리는 이미지 / 자산을 포함 할 수 없습니다 (코드 만). 그래도 미디어 번들 을 사용하여이 문제를 해결할 수 있습니다 .
더 나은 공식적인 정의는 Wikipedia 에서 찾을 수 있습니다 .
동적 라이브러리 -런타임에 링크되어 변경 될 수 있는 코드 단위 및 / 또는 자산 .
그러나 Apple만이 iOS 용 동적 라이브러리를 작성할 수 있습니다. 앱을 거부하므로 앱을 만들 수 없습니다. ( 확인 및 추론에 대해서는 이 다른 SO 게시물을 참조하십시오 ).
소프트웨어 프레임 워크 -작업을 수행하는 컴파일 된 코드 세트입니다. 따라서 실제로 정적 프레임 워크 또는 동적 프레임 워크 를 가질 수 있습니다. 일반적으로 위의 컴파일 된 버전입니다.
자세한 내용은 Wiki on Software Framework 를 참조하십시오.
따라서 iOS에서 유일한 옵션은 기본적으로 정적 라이브러리 또는 정적 프레임 워크를 사용하는 것입니다 (주된 차이점은 정적 프레임 워크는 .a
가장 자주 컴파일 된 파일 로 배포되는 반면 정적 라이브러리는 단순히 하위 프로젝트로 포함될 수 있음) 모든 코드-먼저 컴파일되고 결과 .a
파일은 프로젝트의 종속성으로 사용됩니다).
이제 우리는 이러한 용어에 대해 명확하게 알았으므로 정적 라이브러리를 설정하고 iOS 용 미디어 번들을 지원하는 것은 그리 어렵지 않으며 그렇게하는 방법에 대한 자습서가 많이 있습니다. 나는 개인적으로 이것을 추천 할 것입니다 :
https://github.com/jverkoey/iOS-Framework
이것은 매우 간단한 가이드이며 “가짜 정적 라이브러리”를 다루는 단점이 없습니다 … 자세한 정보는 확인하십시오 …
정적 라이브러리를 만든 후에는 여러 프로젝트에서 사용할 수 있도록 Git 내에 하위 모듈 로 포함시키는 것만 큼 쉽습니다 .
행운을 빕니다.
편집하다
내가 아는 한 프로젝트 내 하위 프로젝트 와 관련하여 올바르게 작동 / 컴파일하려면 하위 프로젝트가 먼저 컴파일되는 컴파일 체인을 설정해야 .a
합니다. 이러한 종속성으로 사용되는 정적 프레임 워크 파일을 만듭니다. 프로젝트에 의해.
이것에 대해 이야기하는 또 다른 유용한 자습서가 있습니다.
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
편집 2
iOS 8부터 Apple은 이제 개발자가 동적 프레임 워크를 만들 수있게합니다! (참고 : 동적 프레임 워크를 포함하려면 앱에 iOS 8의 최소 대상이 있어야합니다. 백 포팅은 허용되지 않습니다.)
이것은 새로운 프로젝트 템플릿으로 추가되었습니다. Xcode 6.1에서는 다음 위치에서 찾을 수 있습니다.
New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
답변
Mach-O 파일 형식 (Mach Object- .o
)
iOS 세계에서 모든 소스 파일은 객체 파일로 변환됩니다-ABI [About] Mach-O 파일 [About] 최종 실행 번들 (예 : 응용 프로그램, 프레임 워크 …), 파일 (예 : 라이브러리 …)로 패키지됩니다. 행동은 [정보]에 의해 결정됩니다Mach-O type
Package
파일 자체로 동작하는 디렉토리입니다 opaque file
. 예상치 못한 프로그램 동작을 유발할 수있는 내부 구조를 약간 변경하여 사용자 경험 을 위해 만들어졌습니다 . 패키지는 Document Package
또는로 사용됩니다 Bundle
. Show Package Contents
Finder에서 사용할 수 있습니다
Bundle
이진 (실행 코드) 및 해당 코드의 리소스 (예 : 이미지, 펜촉 …)를 구성하는 특정 구조의 디렉토리입니다. 번들에는 Info.plist
[정보] 파일이 포함되어 있습니다 . 번들은 개발자 경험을 위해 만들어졌습니다 . 또한 포장이 가능합니다. 번들에는 여러 가지 유형이 있습니다.
application bundle
–Application target
framework bundle
그리고versioned bundle
하위 유형으로-Framework Target
loadable bundle
(akaplug-in bundle
)-Bundle target
(UI 테스트 번들, 단위 테스트 번들)- 기타 (
dSYM
[정보] 번들)
Application
– .ipa
, .app
[소개] – packaged
application bundle
– 실행 가능한 프로그램입니다.
Tests
– packaged
loadable bundle
바이너리를 테스트하는 데 사용됩니다. 플러그인 아키텍처를 통해 기존 바이너리에 별도의 모듈로 새로운 기능 (테스트 사례)을 추가 할 수 있습니다
라이브러리와 프레임 워크
InversionOfControl의 Martin Fowler
라이브러리는 기본적으로 호출 할 수있는 함수 세트이며, 요즘에는 대개 클래스로 구성됩니다. 각 호출은 일부 작업을 수행하고 클라이언트에게 제어권을 반환합니다.
프레임 워크는 더 많은 비헤이비어가 내장 된 일부 추상적 인 디자인을 구현합니다.이를 사용하려면 서브 클래 싱 또는 자체 클래스를 연결하여 프레임 워크의 다양한 위치에 비헤이비어를 삽입해야합니다. 그런 다음 프레임 워크의 코드는이 시점에서 코드를 호출합니다. 프로그램의 주요 제어 기능이 반전되어 사용자에서 프레임 워크로 이동합니다. (제어의 반전)
iOS의 라이브러리 및 프레임 워크
Library
하나 이상의 아키텍처를 위해 컴파일 된 Mach-O 객체 파일 [정적 또는 동적 확인] 모음입니다 .
Static library
– .a
(일명 정적 아카이브 라이브러리, 정적 공유와 연계된다는 라이브러리 [문서] ) – 당신은 당신의 응용 프로그램에 추가 할 때 정적 링커를 하는 동안 컴파일 시간 라이브러리에서 오브젝트 파일을 병합하고 하나의 실행 파일로 응용 프로그램 오브젝트 파일과 함께 패키지화합니다 파일. 단점은 큰 출력 파일입니다
Xcode 9.0부터 Swift 정적 라이브러리가 지원됩니다.
Dynamic library
– .dylib
(일명 동적 공유 라이브러리, 공유 객체, 동적 링크 라이브러리 [doc] )는 로드 또는 런타임시 앱의 실행 파일과 동적으로 링크 되지만 복사되지는 않습니다. 실제로 앱 패키지에는 파일 이 포함 된 Frameworks 폴더가 포함 됩니다. 모든 iOS 및 macOS 시스템 라이브러리는 입니다. 단점은 모든 동적 라이브러리를 복사하고 링크해야하기 때문에 시작 시간이 느리다는 것입니다..dylib
dynamic
Text-based stub library
– .tbd
[정보] , dynamic library
대상 장치에있는 텍스트 스텁입니다 . 결과적으로 번들에 동적 라이브러리를 패키지해서는 안됩니다. 크기 효과가 있습니다.
Framework
일명 binary framework
– .framework
인 not packaged framework bundle
컴파일 포함하는 (개발자가 쉽게 헤더와 자원을 살펴 할 수 있도록하기 위해) static or dynamic
라이브러리, 헤더 파일과 자원을.
Static framework
static library
리소스가 포함 된 패키지를 포함 합니다.
Dynamic framework
dynamic library
및 리소스를 포함합니다 . 또한 동적 프레임 워크는 단일 번들에 동일한 동적 라이브러리의 다른 버전을 포함 할 수 있습니다 ( versioned bundle
)
Embedded framework
하는 dynamic framework
응용 프로그램의 샌드 박스에 살고있다. 이 유형은 공통 코드와 자원을 공유 하기 위해 확장 을 위해 먼저 작성되었습니다 . 배포 대상이 iOS 8 이상인 경우 사용할 수 있습니다.
Umbrella framework
[집계 대상] 은 다른 프레임 워크를 포함하는 프레임 워크입니다. iOS에서 공식적으로 지원 되지 않으므로 개발자가 [공식 문서] 를 작성 하지 않는 것이 좋습니다 . 실제로 이것은 하위 프레임 워크 (또는 중첩 프레임 워크)의 집합입니다. 종속성이있는 프레임 워크를 만들 때 소비자 (예 : 앱)는이 종속성을 프레임 워크와 함께 프로젝트에 추가해야합니다. 개발자는이 의무를 소비자에서 소비자로 이전하는 방법을 찾는 것이 당연합니다. 결과적Umbrella framework
으로 이것이 구조라고 생각하지만 일반적으로 버전 관리와 관련된 심각한 문제로 이어지고 작성 및 지원이 복잡해집니다.
Fake Framework
-는 확장 프로그램이 포함 static library
된 번들을 생성하기위한 특정 작업의 결과입니다 . 이 테크닉은 프레임 워크 템플릿이 없기 때문에 Xcode가 프레임 워크 생성을 지원하지 않을 때 사용되었습니다. 가짜 프레임 워크 의 실현 중 하나 . Xcode 6을 통해 Apple은 iOS 프레임 워크 지원을 추가했습니다..framework
dynamic framework
Modular Framework
[정보] -파일@import
이 들어있는 프레임 워크입니다.modulemap
. 모듈은 하위 모듈을 포함 할 수 있습니다. 주요 장점은로 빌드 시간을 절약한다는 것입니다Modular Framework
.
Universal Library or Framework
(일명 Fat) [lipo] [Aggregate target] 에는 여러 아키텍처가 포함되어 있습니다. 예를 들어 릴리스 빌드는 [ONLY_ACTIVE_ARCH] 를 통해 조정할 수있는 아치를 지원해야합니다 Build Active Architecture Only
.
Dependency
[정보] 대상의 일부로 타사 코드를 사용할 수 있습니다. 다른 프로젝트, 동일한 작업 공간의 프로젝트, 다른 대상, 라이브러리, 프레임 워크 등의 많은 소스에서 코드를 재사용 할 수 있습니다.
정적 라이브러리를 빌드하고 사용하는 방법 :
- [Swift 소비자-> Swift 정적 라이브러리]
- [Swift consumer-> Objective-C 정적 라이브러리]
- [Objective-C 소비자-> Swift 정적 라이브러리]
- [Objective-C 소비자-> Objective-C 정적 라이브러리]
Dynamic Framework를 빌드하고 사용하는 방법 [정적으로 변경]
답변
CocoaPods에 대한 .podspec 파일 ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) 을 만들어 다른 포드와 함께 사용할 수도 있습니다. 개인 포드이며 외부 세계에서는 볼 수 없다는 점만 다릅니다 (포드가 CoreData 모델을 만들어야한다면 어떻게 될지 잘 모르겠지만 이해하지는 않습니다).