programing

App Store 문제에 제출:지원되지 않는 아키텍처 x86

css3 2023. 7. 4. 22:03

App Store 문제에 제출:지원되지 않는 아키텍처 x86

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

  1. 오류 ITMS-90087: "지원되지 않는 아키텍처.실행 파일에 지원되지 않는 아키텍처 '[x86_64, i386]'이(가) 포함되어 있습니다.
  2. 오류 ITMS-90209: "잘못된 세그먼트 정렬.SJAPP.app/Frameworks/Buy.frameworks/Buy의 App Binary에 올바른 세그먼트 정렬이 없습니다.최신 Xcode 버전으로 앱을 다시 빌드해 보십시오." (이미 최신 버전을 사용하고 있습니다.)
  3. 오류 ITMS-90125: "바이너리가 잘못되었습니다.LC_ENCREPTION_INFO load 명령의 암호화 정보가 없거나 잘못되었습니다. 또는 이진이 이미 암호화되어 있습니다.이 바이너리는 Apple의 Linker로 구축되지 않은 것 같습니다."
  4. 경고 ITMS-90080: "실행 가능한 페이로드/..../Buy.framework는 위치 독립 실행 파일이 아닙니다.PIE 실행 파일을 만들 수 있도록 빌드 설정이 구성되어 있는지 확인하십시오."

문제는 구매 프레임워크에 시뮬레이터(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

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

편집: 베리가 게시한 수정된 스크립트를 확인하십시오. 이 스크립트에는 몇 가지 사소한 문제가 있습니다.

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 조각을 시뮬레이터용으로 실행하지 않는 경우(즉, 대상 폴더가 "디버그-아이폰 시뮬레이터"와 같지 않음) 지방 이진에서 제거합니다(존재하는 경우)

죄송합니다, 제가 셸 스크립트에 익숙하지 않아서 누군가 좀 더 우아하게 쓸 수 있을 것 같습니다.하지만 효과가 있습니다)

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

  • 된 된항목carthage copy-frameworks제조 단계
  • 또는 빌드 단계에 모든 프레임워크가 포함되어 있지 않습니다(미완료 목록).

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

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

iOS 단계를 위한 카르타고 건물에서:

응용프로그램 대상의 "빌드 단계" 설정 탭에서 "+" 아이콘을 누른 후 "새 스크립트 실행 단계"를 선택합니다.셸(예: 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이 복사되도록 합니다.

프레임워크(우수한 SVP 진행)를 제거하여 ITMS-90080 오류를 해결했습니다.HUD)는 Embedded Binary 섹션(Xcode target -> General 탭)에서 가져옵니다.

enter image description here

사중인경우를 .CarthageEmbed 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. 이제 프로젝트를 다시 열고 정리, 빌드 및 실행 및 보관 만들기...

저는 여기에 제 2센트를 추가할 것입니다 ( 덜 무서운 방법으로 :-).저는 벤더의 뚱뚱한 라이브러리를 꽤 많이 접했는데, 이 라이브러리들을 (어떤 이유에서) 추가함으로써 정상적인 방식으로 작동하지 않습니다.FrameworksApple에서 문서화한 디렉토리입니다.우리가 그들을 작동시킬 수 있었던 유일한 방법은 그것을 당기는 것입니다..framekwork하고 프젝트연결합니다바로로에디리렉토▁the▁right다를 연결합니다.Embedded Frameworks그리고.Link Binary with Libraries수동으로 설정할 수 있습니다.은 아무, Architectures와 함께 제공됩니다.i386 그리고.x86_64arm건축물

뚱뚱한 도서관의 건축물들을 확인하는 빠른 방법입니다.

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

이와 같은 결과물을 뱉어야 합니다.

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

.i386&x86_64iTunesConnect Archive 업로드 전 프레임워크에서 (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파일을 하므로 를 .lipo -remove 번만x86_64그리고.i386위의 명령은 먼저 실행 파일의 이름을 바꾼 다음 원하는 아치를 제거하고 남은 파일을 정리하는 것입니다.iTunesConnect에 대한 Application Loader Archival은 iTunesConnect의 응용 프로그램 로더 아카이브입니다.

주의사항: 위 단계는 생산을 구축하는 동안에만 수행해야 합니다..framework시뮬레이터 아키텍처에서 제거될 것이며, 시뮬레이터를 기반으로 한 빌드가 작동을 중지할 것입니다(예상됨).개발 환경에서 아키텍처를 제거할 필요가 없습니다..frameworkSimulator와 물리적 장치 모두에서 테스트할 수 있기를 원하기 때문에 파일을 참조하십시오.이 지방라에상경우는에 ,Frameworks프로젝트에 있는 폴더를 확인한 후 수락된 답변을 확인하십시오.

위의 모든 답변에 감사드립니다.다음은 swift 4.25로 작동하는 스크립트입니다._Framework_Name 문자열을 프레임워크의 원래 이름으로 바꿉니다.

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
FRAMEWORK_NAME="Your_Framework_Name.framework"
# Check if Framework is present.
FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
if [ -z $FRAMEWORK_LOCATION ]; then
echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
exit 1
fi
# This script strips unused architectures
find "$APP_PATH" -name "$FRAMEWORK_NAME" -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

나는 스크립트를 추가하고 프레임워크를 몇 번 업데이트해도 같은 문제가 있었습니다.

xCode에서 스크립트가 포함된 후 마지막에 추가되는지 확인합니다.제가 실수로 스크립트를 내장된 프레임워크보다 먼저 이동한 것 같습니다.

enter image description here

참고: xCode 9.1을 사용합니다.

Xcode 10.1용으로 업데이트됨, 아래 솔루션이 작동했습니다.

임베디드 바이너리에서 프레임워크를 제거하고 링크된 프레임워크 및 라이브러리에 추가하기만 하면 됩니다.

아래 스크린샷을 참조하십시오.

enter image description here

이 문제는 pAky88의 답변에서 실행 스크립트를 약간 수정하고 프레임워크를 내장한 후 실행함으로써 해결되었습니다.또한 "설치할 때만 스크립트 실행" 확인란의 선택을 취소해야 합니다.

/usr/local/bin/carthage copy-frameworks

#!/usr/bin/env bash

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"

if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
continue
fi

if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
continue
fi

echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
xcrun 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

빌드 설정 - 유효한 아키텍처 - 릴리스에서 아키텍처 i386 및 x64_86을 제거했고 모든 것이 정상적으로 작동했습니다.

enter image description here

이제 유일한 문제는 시뮬레이터에서 테스트 목적으로 릴리스 빌드를 실행할 수 없다는 것입니다.그러나 원하는 경우 아치를 쉽게 제거한 후 다시 추가할 수 있습니다.

나에게 효과가 있었던 간단한 해결책은

1 - 내장된 프레임워크에서 프레임워크를 제거합니다.

2- 프레임워크를 연결된 프레임워크로 추가합니다.

알았어!

이 오류(ITMS-90240)는 정적(.a) 라이브러리에서도 발생할 수 있습니다.여기 과잉 아키텍처를 제거하기 위한 스크립트가 있습니다.Xcode에서 Target > BuildPhases > 를 클릭하고 Run Script를 선택합니다.그런 다음 스크립트 상자에 붙여넣습니다.

이 스크립트는 .a 파일을 검색하고 문제가 되는 아키텍처가 포함되어 있는지 확인한 다음 해당 아키텍처가 없는 새 .a 파일을 만듭니다.

macOS의 경우:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="armv7 armv7s arm64"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

iOS의 경우:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="x86_64 i386"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

저도 같은 문제가 있었어요.지정된 실행 스크립트를 추가한 후에도 작동하지 않았습니다.그것은 Xcode 관련 이슈였습니다.저는 Xcode 버전 9.0을 사용하고 있었지만, 최신 버전은 9.2였습니다.

그래서 최신 Xcode(9.2)를 설치했고 작동했습니다.

프레임워크는 두 가지를 모두 포함합니다.ARM그리고.x86장치나 시뮬레이터에서 사용할 수 있는 코드입니다.앱을 앱스토어에 제출하려면 다음 스크립트를 실행하여 이진에서 비활성 코드를 제거합니다.

1. 프로젝트 탐색기에서 대상을 선택하고 프로젝트 편집기의 맨 위에 있는 빌드 단계를 클릭합니다.

2. Editor(편집기) 메뉴에서 Add Build Phase(빌드 단계 추가)를 선택한 다음 Add Run Script Build Phase(스크립트 빌드 단계 추가)를 선택합니다(또는 Build Phase(빌드 단계) 편집기의 왼쪽 상단 모서리에 있는 + 버튼을 클릭합니다).

3. 방금 추가된 새 스크립트 실행 빌드 단계 옆에 있는 노출 삼각형을 확장합니다.스크립트 편집기 상자에 bash를 붙여넣습니다.

${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/"YourframeworkName.framework"/strip-frameworks.

다음은 실행 파일에서 하나의 프레임워크 아키텍처만 제거하는 데 사용한 스크립트입니다.

# Remove unused Framework architecture from "YourApp" framework.

FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/YourApp.framework/YourApp"

echo "$FRAMEWORK_EXECUTABLE_PATH"

cp "$FRAMEWORK_EXECUTABLE_PATH" "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

echo "Executing following command to remove x86_64 arch from YourApp framework executable"
echo "lipo -remove x86_64 \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"${FRAMEWORK_EXECUTABLE_PATH}_X86_64\""

lipo -remove x86_64 "${FRAMEWORK_EXECUTABLE_PATH}_X86_64" -o "$FRAMEWORK_EXECUTABLE_PATH"

rm "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

이 스크립트를 프로젝트 대상의 프로젝트 "빌드 단계"에 추가합니다."설치할 때만 스크립트 실행" 확인란을 선택해야 합니다.

Preview of where to insert sample script

언급URL : https://stackoverflow.com/questions/30547283/submit-to-app-store-issues-unsupported-architecture-x86