iOS 용 동적 라이브러리를 빌드하고 런타임에로드 할 수 있습니까?


114

iOS (iPhone / iPad)에서 동적 라이브러리가 지원됩니까?

Xcode에서 New project- > Framework & Library- > Cocoa Library (dynamic) 을 만들려고했습니다 . 프로젝트 설정에서 Base SDK 를로 설정 iOS device 4.1하고 대상을 iOS4.1로 설정했지만 빌드 오류가 있습니다.

target은 'com.apple.product-type.library.dynamic'제품 유형을 지정하지만 'iphonesimulator'플랫폼에는 해당 제품 유형이 없습니다.

내가 선택한 빌드는 Simulator-> Debug-> i386 입니다.



4
iOS8 +는 공유 라이브러리를 기반으로하는 프레임 워크를 지원합니다.
eonil 2014-06-21

1
@Eonil, 그것에 대해 자세히 설명해 줄 수 있습니까? 나는 그것에 대해 더 알고 싶습니다, 기사 또는 일부 정보에 대한 링크를 많이 주시면 감사하겠습니다.
Maxim Chetrusca 2014 년

답변:


105

이 질문을 받았을 당시 동적 라이브러리는 iOS에서 지원되지 않았으므로 앱이 거부됩니다. 정적 라이브러리 만 허용됩니다.

그러나 iOS8에서는 동적 라이브러리와 프레임 워크를 사용할 수 있습니다. "그냥 작동"해야합니다.


14
그 이유를 아는 사람 있나요? 나에게 그것은 완전히 미친 것처럼 보입니다.
Erik de Castro Lopo 2011

73
@Erik de Castro Lopo : 그 이유는 보안 때문입니다. 런타임에 동적 라이브러리를로드 및 언로드 할 수 있으므로 추가 실행 코드를 다운로드 하여로드 할 수 있습니다 (플러그인 생각). 이것은 해커에 의해 손상 될 수 있으며 휴대폰에서 악성 코드가 실행되는 것은 매우 나쁜 일입니다. 또한 승인 된 앱에 승인되지 않은 기능을 추가 할 수도 있습니다. 간단히 말해서,이 환경에서 Apple은 동적 연결을 엄격하게 제어해야하는 Pandoras 상자로 간주합니다. 그렇지 않으면 보안이 손상 될 수 있으며 전화에서 의미가 있음 동의합니다 .
DarkDust 2011

6
AppStore를 통해 배포되지 않는 사내 앱을 개발 중이므로 AppStore에 대한 Apple의 제한 사항은 신경 쓰지 않습니다. iOS 앱용 동적 라이브러리를 만드는 것이 기술적으로 가능합니까?
Aliaksei 2011 년

3
@Aliaksei : 기술적으로 그렇습니다. 그렇지 않으면 Apple의 라이브러리에 연결할 수 없습니다. AFAIK 동적 라이브러리 지원은 Mac OS X에서와 거의 동일합니다. 그러나 Xcode는이를 지원하지 않지만 번들을 사용할 수있는 것 같습니다. 이 문서를 참조하십시오 .
DarkDust 2011 년

3
지원되지 않음은 허용되지 않음과 동일하지 않습니다.
dtech 2014

162

정말와 의견이 맞지 않을거야 DarkDust의 대답 ,하지만 난 내 내면의 빌 클린턴 채널 수 있다면, 그것의 의미에 따라 달라 지지는 것입니다 :)

애플은 앱 스토어 앱에서이 작업을하는 것을 원하지 않지만 운영 체제는 확실히 허용합니다. 탈옥 앱은 항상이 기술을 사용합니다. 기본적으로 표준 UNIX 기술을 사용하여 프레임 워크 / 라이브러리를 동적으로 열고 그 안에있는 것들을 사용합니다. dlopen이 기능을 사용하면 전달하여 라이브러리를 열 수 있습니다 그 프레임 워크의 경로 , 또는 dylib. 탈옥 앱 빌드를위한 일부 문서에서 다음은init() 별도의 dylib 내부에 구현 된 함수 를 호출하는 예입니다 .

#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

또한 iOS 용 동적 라이브러리 프로젝트 를 빌드 할 수 없도록 허용하는 기본 제한 은 일부 XCode xml 파일을 편집하여 재정의 할 수있는 기능이있는 Xcode의 것입니다.

iOS에서 dylib 빌드 및 사용

이렇게하면 일반 iOS .dylib 라이브러리를 빌드하고 위의 샘플 코드에 따라 사용할 수 있습니다. (예, 새 XCode 버전을 설치할 때마다이 기능을 다시 잠금 해제해야합니다.)

따라서 기술적 제한이 아니라 App Store 정책 제한입니다. App Store에 국한되지 않으면 할 수 있습니다. 이 기술은 탈옥 이 필요 하지 않지만 앱이 샌드 박스 인 경우 dylib를로드 할 수있는 위치를 제한 할 수 있습니다.

편집 : 이 정보가 향후 링크 부패로 인해 손실되지 않도록하기 위해 Xcode에서 iOS dylib를 활성화하는 방법에 대해 제공 한 링크의 내용이 있습니다. ( 참고 : 이 프로세스는 여전히 Xcode 4에서 작동하지만 경로 등에 대한 업데이트는 아래 주석을 참조하십시오.) 출처는 iOS Place 블로그입니다 .


Xcode에서는 iOS 용 dylib를 빌드 할 수 없습니다. 단일 바이너리가 아닌 경우 앱이 거부됩니다. 하지만 옵션 모듈을로드하는 플러그인 아키텍처가있는 응용 프로그램이 있습니다. iOS로 완전히 이식하기 전에 개념을 증명할 빠른 프로토 타입을 원합니다. dylib가 간단히 작동 할 수 있다면 더 빠릅니다. 따라서이 게시물은 dylib를 빌드하고 사용하는 방법을 보여 주지만 App Store에서 승인되지 않습니다. (10.6.4에서 Xcode 3.2.4로 테스트 됨)

1. 속성 목록 편집기에서 다음 파일을 엽니 다. /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone 시뮬레이터 ProductTypes.xcspec

2. 제품 유형이 있는“ MacOSX Product Types.xcspec ” 에서 항목 com.apple.product-type.library.dynamic을 찾아“ iPhone Simulator ProductTypes.xcspec ”으로 끕니다 .

Xcode 스크린 샷 1

3. 같은 위치에있는 “ MacOSX Package Types.xcspec ”및“ iPhone Simulator PackageTypes.xcspec ”을 엽니 다 .

4. 패키지 유형이 있는“ MacOSX Product Types.xcspec ” 에서 항목 com.apple.package-type.mach-o-dylib을 찾아“ iPhone Simulator PackageTypes.xcspec ”으로 끕니다 .

Xcode 스크린 샷 2

5. " iPhoneOS.platform "에 대해 단계를 반복하고 실행 중이면 Xcode를 다시 시작합니다.

이제 dylib를 빌드 해 보겠습니다. " Cocoa Touch Static Library "템플릿으로 시작하십시오 . 프로젝트에 Foundation.framework가 포함되어야합니다. 다음은 dylib를 빌드하기 위해 템플릿 위에 변경 한 사항입니다.

1. 텍스트 편집기에서 project.pbxproj 파일 (Xcode 프로젝트 파일 번들에 있음)을 엽니 다 . 문자열“ producttype ”을 검색하고 값을 com.apple.product-type.library.dynamic;

이제 Xcode로 프로젝트를 열고 프로젝트 -> 프로젝트 설정 편집으로 이동 하십시오.

2. dylib를 앱의 실행 파일과 동일한 디렉토리에 넣을 계획이기 때문에 “ 설치 디렉토리 ”를로 설정했습니다 @executable_path/.

3.Mach-O 유형 ”이 동적 라이브러리로 설정 됨

4. " 실행 파일 확장 "을 dylib로 설정

5.실행 파일 접두사 ”가 비어 있음으로 설정 됨

6. 라이브러리에 하나 또는 두 개의 간단한 메서드를 추가하고 빌드합니다.

이제 테스트 할 앱을 만듭니다. 이번에는 보기 기반 애플리케이션을 선택합니다 . UIButton과 UILabel을 연결하여 lib를 호출하고 반환 메시지를 표시합니다. 당신은 할 수 있습니다 전체 프로젝트에서는 TestApp를 다운로드 하고 그것으로 재생할 수 있습니다.


2
엑스 코드 4.5로,이 파일에서 찾을 수 있습니다 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications (예.)
크리스 Devereux

@ChrisDevereux, 감사합니다! 나는 당신의 코멘트에 대한 최신 경로를 확인하기 위해 메모를 넣었습니다 ... 물론, 향후 버전에서 다시 변경 될 수 있습니다. :)
Nate

3
이 답변은 더 많은 업 보트가 필요합니다 (정말로 받아 들여지는 답변이되어야하지만 user510951이 2 년 동안 SO에서 떨어진 후 돌아올 것 같지 않습니다). 아주 좋은 대답 Nate!
chown

1
@chown이 대답이 정확하다고 말하면 일종의 마스터 재정의가 있어야합니다.
Tim

@Panagiotis, 새 질문을 게시하여 올바르게 처리 할 수 ​​있습니다. 사용중인 코드와 모든 오류 메시지를 표시합니다. 원하는 경우이 질문 / 답변으로 다시 링크 할 수도 있습니다 . "iphone-privateapi"태그를 추가하면 볼 수 있습니다. 이것은 앱 스토어를위한 것이 아니라고 말해야합니다. 그렇지 않으면 사람들이 투표하여 질문을 닫을 수 있습니다.
Nate

0

Xcode 11.4.1부터 동적 라이브러리는 허용되지 않습니다 (프로젝트가 모든 대상에 대해 컴파일되지는 않음). libs / frameworks를 사용하는 새로운 방법은 xcodebuild의 create-xcframework입니다.

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