[ios] App Store 이슈에 제출 : 지원되지 않는 아키텍처 x86

그래서 Shopify API를 사용하려고합니다. 앱을 보관하고 유효성을 검사하면 문제가 없지만 앱 스토어에 제출하면 다음과 같은 문제가 발생합니다.

  1. 오류 ITMS-90087 : “지원되지 않는 아키텍처. 실행 파일에 지원되지 않는 아키텍처 ‘[x86_64, i386]’이 (가) 있습니다.”
  2. 오류 ITMS-90209 : “잘못된 세그먼트 정렬. SJAPP.app/Frameworks/Buy.framework/Buy의 앱 바이너리에 올바른 세그먼트 정렬이 없습니다. 최신 Xcode 버전으로 앱을 다시 빌드하십시오.” (나는 이미 최신 버전을 사용하고 있습니다.)
  3. 오류 ITMS-90125 : “이진 파일이 유효하지 않습니다. LC_ENCRYPTION_INFO로드 명령의 암호화 정보가 없거나 유효하지 않거나 이진 파일이 이미 암호화되어 있습니다.이 이진 파일은 Apple의 링커로 빌드되지 않은 것 같습니다.”
  4. 경고 ITMS-90080 : “실행 파일 페이로드 /…./Buy.framework는 위치 독립적 실행 파일이 아닙니다. ur 설정이 PIE 실행 파일을 작성하도록 구성되어 있는지 확인하십시오.”


답변

문제는 Buy 프레임 워크에 시뮬레이터 (x86_64)와 실제 장치 (ARM) 모두에 대한 빌드가 포함되어 있다는 것입니다.

물론 지원되지 않는 아키텍처의 바이너리는 App Store에 제출할 수 없으므로, 솔루션을 제출하기 전에 최종 바이너리에서 불필요한 아키텍처를 “수동으로”제거해야합니다.

Daniel Kennett은 훌륭한 솔루션 을 개발했으며 빌드 단계에 추가 할 수있는 이 스크립트제공합니다 .

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    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"

done

나는 그것을 사용했고 완벽하게 작동했습니다.

편집 : 약간 문제가 있기 때문에 Varrry가 게시 한 수정 된 스크립트를 확인하십시오.


답변

pAkY88의 답변 은 작동하지만 https://stackoverflow.com/a/35240555/5272316의 Mario A Guzman과 같은 문제에 직면했습니다 . 사용하지 않는 아키텍처를 잘라 내면 제거하려고 시도하여 더 이상 스크립트를 실행할 수 없습니다 xcode는 매번 바이너리를 다시 포함하지 않기 때문에 기존 슬라이스가 아닙니다. 아이디어는 아카이브를 만들 때 i386과 x86_64 조각을 제거하기 때문에 스크립트를 수정했습니다.

echo "Target architectures: $ARCHS"

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"

# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
    echo "No need to remove archs"
    ;;
*)
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "i386 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "x86_64 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    ;;
esac

echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

done

이 스크립트는 시뮬레이터를 위해 실행하지 않는 경우 지방 바이너리 (있는 경우)에서 i386 및 x86_64 슬라이스를 제거합니다 (대상 폴더가 “Debug-iphonesimulator”가 아님).

죄송합니다, 쉘 스크립트에 익숙하지 않으므로 누군가가 더 우아한 방식으로 작성할 수 있습니다. 그러나 작동합니다)


답변

Carthage 를 사용 하는 경우 프로젝트가 다음과 같은 이유로이 문제가 발생할 수 있습니다.

  • carthage copy-frameworks빌드 단계가 누락되었습니다 .
  • 또는 빌드 단계에 모든 프레임 워크 (불완전한 목록)가 포함되지는 않습니다.

이 조치는 프레임 워크를 유효한 아키텍처 (코드) 목록으로 필터링합니다 .

복사 프레임 워크 빌드 단계 설정

로부터 아이폰 OS 단계에 대한 카르타고 건물 :

응용 프로그램 대상의 “빌드 단계”설정 탭에서 “+”아이콘을 클릭하고 “새 실행 스크립트 단계”를 선택하십시오. 쉘 (예 : bin / sh)을 지정하는 실행 스크립트를 작성하고 쉘 아래의 스크립트 영역에 다음 내용을 추가하십시오.

/usr/local/bin/carthage copy-frameworks

“입력 파일”에서 사용하려는 프레임 워크의 경로를 추가하십시오.

$(SRCROOT)/Carthage/Build/iOS/Box.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

이 스크립트는 범용 바이너리에 의해 트리거 된 App Store 제출 버그를 해결하고 아카이브시 필요한 비트 코드 관련 파일 및 dSYM이 복사되도록합니다.


답변

Embedded Binaries 섹션 (Xcode target-> General 탭)에서 프레임 워크 (우수한 SVProgressHUD)를 제거하여 ITMS-90080 오류를 해결했습니다.

여기에 이미지 설명을 입력하십시오


답변

당신이 사용하는 경우 Carthage메이크업을해야합니다 당신은 Embed Frameworks Build Step전과입니다Carthage copy-frameworks


비정상적인 경우 (예 : Lottie-iOS 프레임 워크) :

  • 평소처럼 단순히 “링크 라이브러리”에 넣습니다.

  • 그러나 당신이 할 필요 명시 적으로 ‘소스 프레임 워크 “에 추가 (만’소스 프레임 워크”에있을 때 그것을 완벽하게 작동하기 때문에 즉, 무의미 해 보인다하더라도)

  • 복사 프레임 워크에 넣어

  • 복사 프레임 워크를 보장하는 것입니다 ‘소스 프레임 워크 “


답변

아래 단계를 사용하여 프레임 워크에서 [x86_64, i386] 을 제거하십시오 . [x86_64, i386] 은 시뮬레이터에 사용됩니다.

  1. 열다 Terminal

  2. 각 프레임 워크의 프로젝트 드래그 경로를 터미널로 엽니 다.

    예 : cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. 아래 명령에서 프레임 워크 이름을 설정하고 실행하십시오.

lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

  1. 이제 프로젝트를 다시 열어 Clean, Build & Run 및 Create Archive …

답변

나는 여기에 2 센트를 더 무서워하지 않을 것입니다 :-). Frameworks애플이 문서화 한 디렉토리 에 추가하여 정상적인 방식으로 작동하지 않는 공급 업체의 뚱뚱한 라이브러리가 많이 있습니다. 우리가 그것들을 작동시킬 수있는 유일한 방법 .framekwork은 프로젝트 디렉토리로 권한을 가져 Embedded Frameworks오고 Link Binary with Libraries빌드 설정에서 수동으로 링크하는 것 입니다. 그러나 이것은 지방 라이브러리와 마찬가지로 외부 시뮬레이터 아키텍처 i386 x86_64함께 아키텍처 와 함께 제공 되므로 문제없이 작동하는 것으로 보입니다 arm.

팻 라이브러리에서 아키텍처를 확인하는 빠른 방법은

$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`

다음과 같은 출력을 뱉어야합니다.

Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64

이는 iTunesConnect Archival 업로드 전에 프레임 워크에서 “지방을 트리밍”(즉 i386, & x86_64) 해야한다는 것을 확인합니다. 이 아키텍처는 허용되지 않습니다 (iOS에서는 지원되지 않으므로).

자, 여기에있는 모든 대답 (또는 최소한의 대답 중 적어도)은 프레임 워크가 Frameworks디렉토리 에있는 경우에만 실제로 잘 작동하는 훌륭한 실행 스크립트를 제공합니다 . 쉘 스크립트 중독자가 아닌 한, 수정하지 않은 스크립트는 위에서 설명한 시나리오에서 작동하지 않습니다. 그러나 프레임 워크에서 i386& x86_64아키텍처를 제거하는 매우 간단한 방법이 있습니다.

  1. 프로젝트 디렉토리에서 터미널을 엽니 다.

  2. 직접으로 변경 디렉토리 .framekwork처럼,

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. 아래와 같이 일련의 명령을 실행하십시오.

$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs

여기서주의해야 할 사항 lipo -remove은 각 아키텍처를 제거 할 때마다 한 번씩 수행해야합니다. lipo입력 파일을 수정하지 않고 파일 만 생성하므로 and에 lipo -remove대해 한 번만 실행해야합니다 . 위의 명령은 먼저 실행 파일의 이름을 바꾸고 원하는 아치를 제거한 다음 남은 파일을 정리하여 간단히 수행합니다. 이제 응용 프로그램 로더 보관 파일에 iTunesConnect로 업로드 할 때 녹색 확인 표시가 나타납니다.x86_64i386

명심해야 할 사항 : .framework시뮬레이터 아키텍처에서 제거 될 예정 이므로 시뮬레이터 빌드가 작동을 멈 춥니 다 (예상). 개발 환경에서는 .framework시뮬레이터와 실제 장치 모두에서 테스트 할 수 있기 때문에 파일 에서 아키텍처를 제거 할 필요가 없습니다 . 뚱뚱한 라이브러리 Frameworks가 프로젝트 의 폴더에 있으면 수락 된 답변을보십시오.