iOS 정적 및 동적 프레임 워크 설명


115

iOS 8의 출시와 함께 iOS의 동적 및 정적 프레임 워크에 대해 약간 혼란 스러움을 인정해야합니다.

내가 만든 라이브러리를 배포 할 방법을 찾고 있는데 iOS 7 이상을 지원해야합니다. (참고 : 이것은 독점 프레임 워크입니다. 저는 코코아 포드를 사용할 수 없으며 소스를 배포 할 수도 없습니다). 내가 이미 알고있는 것은 다음과 같습니다.

  • iOS 8은 iOS 용 "임베디드 프레임 워크"를 도입했지만 내가 이해하는 바와 같이 iOS 8 이상에서만 iOS 7에서 작동하지 않습니다.
  • 내 라이브러리를 정적 라이브러리 (.a 파일)로 배포하고 헤더도 배포 할 수있는 옵션이 있습니다. 이것이 상황을 처리하는 일반적인 방법이라는 것을 알고 있지만 그보다 더 간단한 것을 찾고 싶습니다 (가능한 경우 일부 리소스를 번들로 묶을 수도 있음).
  • 또한 iOS 7은 동적 연결을 지원하지 않기 때문에 동적 .framework 라이브러리 (정적 만)를 지원하지 않는다는 것을 발견했습니다. 그러나 iOS 8은 정적 링크와 마찬가지로 작동합니다.

이 정보에 관한 제 질문은 다음과 같습니다.

  • Mach-O 유형을 "정적 라이브러리"로 변경하여 .framework 대상을 만들고 정적으로 만들 수 있음을 알았습니다. 문제없이 iOS 7을 지원하고 내 라이브러리를 .framework 번들? 그렇다면 인터넷의 많은 리소스가 제안하는 것처럼 iOS 8의 "임베디드 프레임 워크"가 큰 거래가되는 이유는 무엇입니까?
  • 내가 만든 다른 응용 프로그램과 마찬가지로 .framework를 코드 서명해야합니까?
  • .framework 파일에 다른 리소스 (예 : 핵심 데이터 또는 이미지)를 포함해야하는 경우 어떻게합니까? 이를 위해 별도의 .bundle 파일을 만들어야합니까?

1
"iOS 7은 동적 연결을 지원하지 않기 때문에 .framework 라이브러리를 지원하지 않습니다."이 문장은 올바르지 않습니다.
Midhun MP

1
내가 참조. 정확한 문장을 말씀해 주시겠습니까? iOS 7이 동적 링크를 지원하거나 iOS 7이 .framework 라이브러리를 지원하기 때문에 거짓입니까? 아니면 둘다?
csotiriou

1
Remeber AVFoundation 및 CoreGraphics는 모두 .framework입니다. 아마도 이것은 모든 질문에 대한 답을 찾는 데 도움이 될 것입니다 : raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

문장을 수정했습니다. 내 질문을 게시하기 전에 이미 링크를 읽었습니다. 이 링크는 내 질문에 대해 설명하지 않습니다. 정적 라이브러리에서 시작하여 수동으로 .framework 파일로 래핑합니다. Xcode 6의 Cocoa Touch Framework 대상에 대해 이야기하고 유형을 정적 라이브러리로 변경합니다. 그것은 코드 서명을 언급하지 않는다 (왜 그것을 필요하다면) 등, 추가 리소스,
csotiriou

1
CocoaPods를 사용하여 독점 프레임 워크 (예 : Parse)를 배포 할 수 있습니다.
Ric Santos

답변:


69

iOS8 이전에 Xcode는 iOS 용 정적 라이브러리 생성 옵션 만 허용했습니다. 일반적인 문제는 바이너리와 헤더를 별도로 배송해야한다는 것입니다.

나중에 일부 개발자는 '정적 프레임 워크'를 만드는 아이디어를 얻었습니다. [.framework는 lib와 헤더에 대한 심볼릭 링크가있는 폴더 일뿐입니다]. 이러한 예 중 하나는 https://github.com/jverkoey/iOS-Framework입니다.

이 옵션은 iOS 7 또는 8 또는 그 이전 버전에서 작동합니다. 헤더 파일을 번들로 묶는 편리함을 갖춘 정적 라이브러리이기 때문입니다.

리소스에 대한 질문은 '.bundle'로 묶어야합니다 .. 배송을 위해 .framework 폴더에 넣을 수 있는지 잘 모르겠습니다 .. 과거에는 내 라이브러리를 다음과 같이 배송했습니다. 정적 프레임 워크 및 번들 ...

그러나 Swift를 사용하면 위의 옵션이 작동하지 않습니다. Xcode는 신속한 코드를 포함하는 정적 라이브러리 빌드를 지원하지 않습니다.

신속한 사용이있는 경우 동적 프레임 워크를 사용해야합니다. 이론적으로 동적 프레임 워크는 iOS7에서 작동합니다.하지만 앱이 iOS7을 대상으로하고 동적 프레임 워크를 사용하는 경우 iTunes Connect가 거부 할 것이라고 생각합니다. :-).

도움이 되었기를 바랍니다


16

Xcode 9 이상에서는 Swift 용 정적 프레임 워크도 만들 수 있습니다. 이는 ABI 소스 호환성으로 인해 가능합니다. Mach-O type프레임 워크 타겟 의 언더 빌드 설정을 변경하기 만하면 됩니다. 이 기술은 하이브리드 프레임 워크 (Swift 및 Objective-C 코드를 사용한 프레임 워크)에도 적용 할 수 있습니다.


좋은 팁. 이 답변이 저를 도왔 기 때문에 왜 점수가 낮았는지 모르겠습니다. \ Target'Build Settings \ Mach-O-Type을 선택하고 Static Framework를 선택합니다.
rustyMagnet

3
ABI 호환성은 빠른 4에서 사용할 수 없습니다
csotiriou

7

static또는 dynamic이름에서 일반적으로 Linking[정보] 유형을 가리 킵니다.

프레임 워크는 static또는 [정적 또는 동적 검사] 일 수 있습니다 dynamic.

[정보] 를 또는 Linker로 변경 하여에 영향을 미칠 라이브러리 형식을 변경할 수 있습니다 . 기본적으로 Xcode에는 값이 있습니다.Framework target -> Build Settings -> Mach-O TypeStatic LibraryDynamic LibraryDynamic Library

이 설정에 따라 다른 유형의 바이너리가 생성됩니다.

소비자를 성공적으로 구성한 후 [Link vs Embed]

Static Linker ld : 컴파일 시간에의 모든 코드를 static library실행 가능한 개체 파일에 포함합니다.

Dynamic Linker dyld :로드 / 런타임시 @rpath[About]을 사용하여 임베디드 프레임 워크를 찾고 링크합니다.

[어휘]


6

Swift는 정적 라이브러리에서 작동하지 않습니다. 동적 프레임 워크를 사용해야하는 경우 AppStore 가 동적 프레임 워크가있는 iOS 7을 거부 하므로 최소 iOS를 8.0으로 설정해야합니다.


정적 라이브러리를 신속한 기반 프로젝트로 가져올 수 있습니다
C0D3

5

나는 모든 답을 가지고 있지는 않지만 여기에서 몇 가지 질문에 답하려고 노력할 것입니다.

  • iOS 7에서 이러한 프레임 워크를 사용하면 경고가 표시되지만 그게 전부입니다. 경고입니다. 이 답변을 참조하십시오 .

  • CoreData와 같은 다른 리소스를 포함 할 수 있지만 코드에서 수동으로 만들어야합니다. 다음 은 핵심 데이터 모델을 만드는 방법을 보여주는 자습서 입니다.

  • iOS 용 동적 라이브러리를 코딩해야합니다.

  • 배포 할 계획이라면 프레임 워크가 시뮬레이터와 디바이스 아키텍처를 모두 지원하는지 확인해야합니다.

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