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 파일을 만들어야합니까?
답변
iOS8 이전에 Xcode는 iOS 용 정적 라이브러리 생성 옵션 만 허용했습니다. 일반적인 문제는 바이너리와 헤더를 별도로 배송해야한다는 것입니다.
나중에 일부 개발자는 ‘정적 프레임 워크’를 만드는 아이디어를 얻었습니다. [.framework는 lib와 헤더에 대한 심볼릭 링크가있는 폴더 일뿐입니다]. 이러한 예 중 하나는 https://github.com/jverkoey/iOS-Framework입니다.
이 옵션은 iOS 7 또는 8 또는 그 이전 버전에서 작동합니다. 헤더 파일을 번들로 묶는 편리함을 갖춘 정적 라이브러리이기 때문입니다.
리소스에 대한 질문은 ‘.bundle’로 묶어야합니다 .. 배송을 위해 .framework 폴더에 넣을 수 있는지 잘 모르겠습니다 .. 과거에는 내 라이브러리를 다음과 같이 배송했습니다. 정적 프레임 워크 및 번들 …
그러나 Swift를 사용하면 위의 옵션이 작동하지 않습니다. Xcode는 신속한 코드를 포함하는 정적 라이브러리 빌드를 지원하지 않습니다.
신속한 사용이있는 경우 동적 프레임 워크를 사용해야합니다. 이론적으로 동적 프레임 워크는 iOS7에서 작동합니다.하지만 앱이 iOS7을 대상으로하고 동적 프레임 워크를 사용하는 경우 iTunes Connect가 거부 할 것이라고 생각합니다. :-).
도움이 되었기를 바랍니다
답변
Xcode 9 이상에서는 Swift 용 정적 프레임 워크도 만들 수 있습니다. 이는 ABI 소스 호환성으로 인해 가능합니다. Mach-O type
프레임 워크 타겟 의 언더 빌드 설정을 변경하기 만하면 됩니다. 이 기술은 하이브리드 프레임 워크 (Swift 및 Objective-C 코드를 사용한 프레임 워크)에도 적용 할 수 있습니다.
답변
static
또는 dynamic
이름에서 일반적으로 Linking
[정보] 유형을 가리 킵니다.
프레임 워크는 static
또는 [정적 또는 동적 검사] 일 수 있습니다 dynamic
.
[정보] 를 또는 Linker
로 변경 하여에 영향을 미칠 라이브러리 형식을 변경할 수 있습니다 . 기본적으로 Xcode에는 값이 있습니다.Framework target -> Build Settings -> Mach-O Type
Static Library
Dynamic Library
Dynamic Library
이 설정에 따라 다른 유형의 바이너리가 생성됩니다.
소비자를 성공적으로 구성한 후 [Link vs Embed]
Static Linker
ld : 컴파일 시간에의 모든 코드를 static library
실행 가능한 개체 파일에 포함합니다.
Dynamic Linker
dyld :로드 / 런타임시 @rpath
[About]을 사용하여 임베디드 프레임 워크를 찾고 링크합니다.
답변
Swift는 정적 라이브러리에서 작동하지 않습니다. 동적 프레임 워크를 사용해야하는 경우 AppStore 가 동적 프레임 워크가있는 iOS 7을 거부 하므로 최소 iOS를 8.0으로 설정해야합니다.