developer tip

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

optionbox 2020. 7. 28. 08:26
반응형

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


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

Xcode에서 새 프로젝트 -> 프레임 워크 및 라이브러리 -> Cocoa Library (dynamic) 을 만들려고했습니다 . 프로젝트 설정에서 Base SDK 를로 설정 iOS device 4.1하고 target을 iOS4.1로 설정했지만 빌드 오류가 있습니다.

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

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


이 질문을 받았을 때 iOS에서 동적 라이브러리를 지원하지 않아 앱이 거부되었습니다. 정적 라이브러리 만 허용됩니다.

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


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

Apple은 App Store 앱에서이 작업을 수행하기를 원하지 않지만 운영 체제에서이를 허용합니다. 탈옥 앱은 항상이 기술을 사용합니다. 기본적으로 표준 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에서 일부 XCode xml 파일을 편집하여 대체 할 수있는 기능입니다.

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. Locate the item in the “MacOSX Product Types.xcspec” that has the package type com.apple.package-type.mach-o-dylib and drag it to the “iPhone Simulator PackageTypes.xcspec”.

Xcode 스크린 샷 2

5. Repeat the steps for the “iPhoneOS.platform” and relaunch Xcode if it was running.

Now, lets build a dylib. Start out with the “Cocoa Touch Static Library” Template. That should included the Foundation.framework in the project. Here are the changes I made on top of the template to build dylib.

1. Open the file project.pbxproj (found inside the Xcode project file bundle) in a Text Editor. Search for string “producttype”, change it’s value to com.apple.product-type.library.dynamic;

Now, open the project with Xcode, go to Project->Edit Project Settings

2.Installation Directory” set to @executable_path/ because I plan to put the dylib in the same directory as the app’s executable.

3.Mach-O Type” set to Dynamic Library

4.Executable Extension” set to dylib

5.Executable Prefix” set to empty

6. Add one or two simple methods to the library and build it.

이제 테스트 할 앱을 만듭니다. 이번에는 View-based Application을 선택합니다 . UIButton과 UILabel을 연결하여 lib를 호출하고 리턴 메시지를 표시하십시오. 전체 프로젝트 TestApp을 다운로드하여 사용할 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/4733847/can-you-build-dynamic-libraries-for-ios-and-load-them-at-runtime

반응형