programing

Xcode 12.3: iOS 시뮬레이터를 위한 빌드이지만, 링크되고 내장된 프레임워크는 iOS + iOS 시뮬레이터를 위해 빌드되었습니다.

muds 2023. 7. 15. 10:40
반응형

Xcode 12.3: iOS 시뮬레이터를 위한 빌드이지만, 링크되고 내장된 프레임워크는 iOS + iOS 시뮬레이터를 위해 빌드되었습니다.

나는 링크되고 내장된 사용자 정의 프레임워크를 사용하는 앱을 가지고 있습니다.그 앱은 Xcode 12.2까지 iOS 기기와 시뮬레이터를 위해 적절하게 구축되었습니다.하지만 Xcode 12.3부터는 다음과 같은 오류가 발생합니다.

iOS Simulator를 위한 빌드이지만, 링크되고 내장된 프레임워크 'My.framework'는 iOS + iOS Simulator를 위해 빌드되었습니다.

모두에 되었으며 () 를 사용하여 됩니다.lipo따라서 모든 곳에서 문제 없이 실행할 수 있어야 합니다.

내가 뭘 빠트렸나요?Xcode 12.3에 관련 변경 사항이 있습니까?

유감스럽게도 이것은 사실 정확한 오류이며 프레임워크에 iOS와 iOS 시뮬레이터 코드가 동시에 포함되어서는 안 됩니다.애플은 우리에게 사용을 강요하려고 합니다.XCFramework이 목적을 위한 s.그들은 그것을 Xcode 11에서 시작했고 제한을 강화했습니다.

이 문제를 해결하는 유일한 올바른 방법은 프레임워크를 XCF 프레임워크로 재구축하는 것입니다.다음 중 쉬운 작업:

xcrun xcodebuild -create-xcframework \
    -framework /path/to/ios.framework \
    -framework /path/to/sim.framework \
    -output combined.xcframework

은 결합된 할 수 ..framework프레임워크의 복사본 두 개를 만들고 다음을 사용합니다.lipo다른 SDK와 연결된 슬라이스를 이진에서 제거합니다.

이것은 여기 애플의 원답을 바탕으로 한 것입니다.

저의 특별한 경우는 이러한 프레임워크를 생산하는 로마를 사용하여 이 오류가 발생한다는 것입니다(가능한 해결책은 여기에 있습니다).또한 카르타고 측에서는 많은 투쟁이 진행되고 있습니다.

시뮬레이터를 위해 빌드하는 동안 장치 아키텍처를 제외해야 하며 장치를 위해 빌드하는 동안 시뮬레이터의 아키텍처를 제외해야 합니다.

이 작업을 수행하려면 다음으로 이동합니다.Build Settings프로젝트의 -> 프젝트의로 ->Excluded Architectures/Etc -> + > 탭하기 + -> -> + 를 누릅니다.Any iOS Simulator SDK -> 가추arm64,arm64e,armv7

마찬가지로, 마가지로, 가추를 합니다.x86_64,i386Any iOS SDK.

enter image description here

PS: 다음을 실행하여 프레임워크에 있는 모든 아키텍처를 확인할 수 있습니다.file <path_to_framework_binary>또는lipo -info <path_to_framework_binary>.

file /Users/srikanth.kv/MyProject/MyLibrary.framework/MyLibrary

나는 다음을 포함하는 범용 이진법을 가진 프레임워크를 가지고 있습니다.x86_64그리고.arm64내가 합병하는 것.lipo프레임워크 빌드 시 사용자 지정 스크립트를 사용합니다.Xcode 12.3에 대해서도 동일한 문제가 발생하여 현재 해결책을 마련했습니다.이 문제가 Xcode에서 빨리 해결되기를 바라지만, 그 때까지 한 가지 빠른 해결책은 아키텍처를 얇게 하고 필요한 프레임워크를 사용하는 것입니다.

프레임워크 작성자를 위한 장기 솔루션인 .xcframeworks의 생산을 시작하는 방법에 대한 답변을 여기에서 확인하십시오.

예를 들어, 내 범용 프레임워크가 있는 작업 디렉토리의 터미널에 있다고 가정해 보겠습니다.some_framework.framework실제 물리적 장치에서 실행하려면 다음 명령을 실행합니다.

lipo -thin arm64 some_framework.framework/some_framework -output some_framework

위의 명령을 사용하여 다음을 추출합니다.arm64이진의그런 다음 전류를 교체합니다.some_framework.framework/some_framework새로 생성된 것과 함께.arm64유일한 이진수

mv some_framework some_framework.framework

범용 프레임워크가 Objective-C 소스로만 구축되어 있으면 작업이 완료됩니다.하지만 스위프트 코드가 있으면 업데이트해야 합니다.some_framework.framework/Modules/some_framework.swiftmodule그것은 그것이 포함하지 않는 아키텍처에 대한 어떠한 참조도 포함하지 않습니다.arm64.

필요한 경우를 제외하고 시뮬레이터에서 실행하기 위해 유사한 프로세스를 수행합니다.x86_64저는 현재 이 문제가 해결될 때까지 두 가지 버전의 프레임워크를 유지하고 있습니다.시뮬레이터와 기기를 전환할 때마다 프로젝트에 포함된 프레임워크를 전환하기만 하면 됩니다.

해결 방법을 사용하면 프로젝트에서 실수로 인한 답변 외에도 이 문제를 자동으로 처리할 수 있습니다.

  1. Xcode 12.3에서 작동하지 않는 범용 프레임워크를 다음으로 설정합니다.Do not embed(일반프레임워크, 라이브러리임베디드 콘텐츠)

  2. 빌드 단계에서 이 "새 실행 스크립트 단계"를 추가합니다.

    FRAMEWORK_APP_PATH="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
    
    # 1. Copying FRAMEWORK to FRAMEWORK_APP_PATH
    find "$SRCROOT" -name '*.framework' -type d | while read -r FRAMEWORK
    do
    if [[ $FRAMEWORK == *"MY_WONDERFUL_UNIVERSAL_FRAMEWORK.framework" ]]
    then
        echo "Copying $FRAMEWORK into $FRAMEWORK_APP_PATH"
        cp -r $FRAMEWORK "$FRAMEWORK_APP_PATH"
    fi
    done
    # 2. Loops through the frameworks embedded in the application and removes unused architectures.
    find "$FRAMEWORK_APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
    do
    if [[ $FRAMEWORK == *"MY_WONDERFUL_UNIVERSAL_FRAMEWORK.framework" ]]
    then
    
        echo "Strip invalid archs on: $FRAMEWORK"
        FRAMEWORK_EXECUTABLE_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "$FRAMEWORK/Info.plist")
        FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
        echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
        EXTRACTED_ARCHS=()
        for ARCH in $ARCHS
        do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
        done
        echo "Merging extracted architectures: ${ARCHS}"
        lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
        rm "${EXTRACTED_ARCHS[@]}"
        echo "Replacing original executable with thinned version"
        rm "$FRAMEWORK_EXECUTABLE_PATH"
        mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
        codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements $FRAMEWORK_EXECUTABLE_PATH
    else
        echo "Ignored strip on: $FRAMEWORK"
    fi
    done
    
  • 를 바꿉니다.MY_WONDERFUL_UNIVERSAL_FRAMEWORK당신의 프레임워크의 이름으로 그리고 그것이 위치하는지 확인하세요.SRCROOT

언급URL : https://stackoverflow.com/questions/65303304/xcode-12-3-building-for-ios-simulator-but-the-linked-and-embedded-framework-wa

반응형