도서관? 공전? 동적? 아니면 프레임 워크? 다른 프로젝트 내부의 프로젝트


151

기존 iOS 앱이 있고 테스트하기 쉽도록 다른 프로젝트로 개발 한 코드 덩어리를 추가하고 싶습니다. 새로운 청크는 기본적으로 다양한 공유 서비스 등에 이미지를 저장합니다. 공유 코드에는 많은 테스트와 향후 업데이트가 필요하기 때문에 해당 코드 청크를 기존 앱에 통합하는 가장 좋은 방법이 궁금합니다.

정적 라이브러리, 동적 라이브러리 또는 프레임 워크인지 여부를 모르겠으며 솔직히 차이점이 무엇인지, 어떻게해야하고 Xcode에서 어떻게 설정해야하는지 잘 모르겠습니다.

내가 아는 것은 공유 코드에 대한 별도의 테스트 및 업데이트 응용 프로그램을 유지하고 기본 응용 프로그램에서 사용하도록해야한다는 것입니다.


'프레임 워크 내부 프레임 워크'와 같은 우산 프레임 워크를 만들 수 있습니다. stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi

답변:


204

먼저 몇 가지 일반적인 정의 (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

지금까지 하위 프로젝트가 내가 원하는 것 같고 기사가 완벽했습니다. 나는 하나의 이상한 부작용을 발견했습니다. 주 프로젝트 내에서 드래그 한 하위 프로젝트에는 테스트 코드 (viewcontroller 및 nib, appdelegate 등)가 있으며, 내가 사용하려는 클래스 만 확인했습니다. 메인 프로젝트는 정적 라이브러리에서 사용되도록 확인됩니다. 그러나 어떤 이유로 든 주요 프로젝트의 펜촉 파일에 첨부하려고 할 때 하위 프로젝트의 아울렛과 작업도 표시되었습니다. 이것은 분명히 혼란을 초래할 수 있습니다. 그것들을 제거하기위한 팁이 있습니까? 감사!
피자 영화

동적 프로젝트를 정적 프로젝트로 끌어서 놓아 정적 프로젝트로 만들 수 있습니까? 나는 정말로 혼란스러워 약간의 설명이 정말로 좋을 것입니다! 미리 감사드립니다 :-)
Ravindranath Akila

1
@ JRG-Developer 일부 규칙을 따르는 경우 역 이식 동적 프레임 워크가 허용됩니다. developer.apple.com/library/prerelease/ios/documentation/…
klefevre

최소 목표를 더 낮게 설정하고 라이브러리를 선택적으로 만들 수 있습니까?
kukudas

1. 정적 라이브러리, 동적 라이브러리, 프레임 워크의 잘 알려진 예를 포함시킬 수 있습니까? 2. 어디에서해야하는지 예를들 수 있습니까? 3. 포드와 정적 라이브러리의 차이점이 무엇인지 궁금하십니까?
Honey

30

Mach-O 파일 형식 (Mach Object- .o)

iOS 세계에서 모든 소스 파일은 객체 파일로 변환됩니다-ABI [About] Mach-O 파일 [About] 최종 실행 번들 (예 : 응용 프로그램, 프레임 워크 ...), 파일 (예 : 라이브러리 ...)로 패키지됩니다. 행동은 [정보]에 의해 결정됩니다Mach-O type

Package파일 자체로 동작하는 디렉토리입니다 opaque file. 예상치 못한 프로그램 동작을 유발할 수있는 내부 구조를 약간 변경하여 사용자 경험 을 위해 만들어졌습니다 . 패키지는 Document Package또는로 사용됩니다 Bundle. Show Package ContentsFinder에서 사용할 수 있습니다

Bundle이진 (실행 코드) 및 해당 코드의 리소스 (예 : 이미지, 펜촉 ...)를 구성하는 특정 구조의 디렉토리입니다. 번들에는 Info.plist[정보] 파일이 포함되어 있습니다 . 번들은 개발자 경험을 위해 만들어졌습니다 . 또한 포장이 가능합니다. 번들에는 여러 가지 유형이 있습니다.

  • application bundle - Application target
  • framework bundle그리고 versioned bundle하위 유형으로-Framework Target
  • loadable bundle(aka plug-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 시스템 라이브러리는 입니다. 단점은 모든 동적 라이브러리를 복사하고 링크해야하기 때문에 시작 시간이 느리다는 것입니다..dylibdynamic

[정적 및 ​​동적 연결]

Text-based stub library- .tbd[정보] , dynamic library대상 장치에있는 텍스트 스텁입니다 . 결과적으로 번들에 동적 라이브러리를 패키지해서는 안됩니다. 크기 효과가 있습니다.

Framework일명 binary framework- .frameworknot packaged framework bundle컴파일 포함하는 (개발자가 쉽게 헤더와 자원을 살펴 할 수 있도록하기 위해) static or dynamic라이브러리, 헤더 파일과 자원을.

Static frameworkstatic library리소스가 포함 된 패키지를 포함 합니다.

Dynamic frameworkdynamic library및 리소스를 포함합니다 . 또한 동적 프레임 워크는 단일 번들에 동일한 동적 라이브러리의 다른 버전을 포함 할 수 있습니다 ( versioned bundle)

[정적 대 동적 프레임 워크]

Embedded framework하는 dynamic framework응용 프로그램의 샌드 박스에 살고있다. 이 유형은 공통 코드와 자원을 공유 하기 위해 확장 을 위해 먼저 작성되었습니다 . 배포 대상이 iOS 8 이상인 경우 사용할 수 있습니다.

Umbrella framework [집계 대상] 은 다른 프레임 워크를 포함하는 프레임 워크입니다. iOS에서 공식적으로 지원 되지 않으므로 개발자가 [공식 문서] 를 작성 하지 않는 것이 좋습니다 . 실제로 이것은 하위 프레임 워크 (또는 중첩 프레임 워크)의 집합입니다. 종속성이있는 프레임 워크를 만들 때 소비자 (예 : 앱)는이 종속성을 프레임 워크와 함께 프로젝트에 추가해야합니다. 개발자는이 의무를 소비자에서 소비자로 이전하는 방법을 찾는 것이 당연합니다. 결과적Umbrella framework으로 이것이 구조라고 생각하지만 일반적으로 버전 관리와 관련된 심각한 문제로 이어지고 작성 및 지원이 복잡해집니다.

Fake Framework-는 확장 프로그램이 포함 static library된 번들을 생성하기위한 특정 작업의 결과입니다 . 이 테크닉은 프레임 워크 템플릿이 없기 때문에 Xcode가 프레임 워크 생성을 지원하지 않을 때 사용되었습니다. 가짜 프레임 워크 의 실현 중 하나 . Xcode 6을 통해 Apple은 iOS 프레임 워크 지원을 추가했습니다..frameworkdynamic framework

Modular Framework[정보] -파일@import이 들어있는 프레임 워크입니다.modulemap. 모듈은 하위 모듈을 포함 할 수 있습니다. 주요 장점은로 빌드 시간을 절약한다는 것입니다Modular Framework.

Universal Library or Framework(일명 Fat) [lipo] [Aggregate target] 에는 여러 아키텍처가 포함되어 있습니다. 예를 들어 릴리스 빌드는 [ONLY_ACTIVE_ARCH] 를 통해 조정할 수있는 아치를 지원해야합니다 Build Active Architecture Only .

Dependency[정보] 대상의 일부로 타사 코드를 사용할 수 있습니다. 다른 프로젝트, 동일한 작업 공간의 프로젝트, 다른 대상, 라이브러리, 프레임 워크 등의 많은 소스에서 코드를 재사용 할 수 있습니다.

정적 라이브러리를 빌드하고 사용하는 방법 :

Dynamic Framework를 빌드하고 사용하는 방법 [정적으로 변경]

[Xcode 빌드 시스템]
[Xcode 구성 요소]
[동적 링커]


1
많은 Swift 튜토리얼에서 Objective C는 신속한 지원으로 [ altexsoft.com/blog/engineering/… ] 인 동적 라이브러리를 지원하지 않는다고 언급 했지만, 내가 알고있는 것처럼 OS8부터 Objctive C는 동적 라이브러리를 지원합니다. 이것을 명확히 할 수 있습니까?
pratima

@pratima, iOS 용 Objective-C에서 동적 프레임 워크를 작성할 수 있습니다
yoAlex5

1
"정적 프레임 워크에는 리소스와 함께 패키지 된 정적 라이브러리가 포함되어 있습니다." 이 정의는 어디에서 왔습니까? 정적 프레임 워크의 "Copy Bundle Resources"빌드 단계 인 AFAK는 정적 라이브러리처럼 작동하지 않습니다. 정적 프레임 워크와 정적 라이브러리의 차이점은 무엇입니까?
toshi0383

@ toshi0383 정적 라이브러리 (.a)와 리소스 (.bundle)를 소비자에게 배포 할 수있는 단일 프레임 워크로 병합하는 방법을 찾았습니까?
user121095

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.