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


253

그래서 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 실행 파일을 작성하도록 구성되어 있는지 확인하십시오."

4
첫 번째 메시지는 마치 시뮬레이터 빌드 인 것처럼 들립니다.
Phillip Mills

제출할 아카이브를 만들 때 장치 옵션에서 iOS 장치를 선택한 다음 요청하는 경우 아카이브를 만듭니다
Saurabh Jain

2
@PhillipMills에 동의합니다. 첫 번째 오류에 집중하십시오. iOS 앱에 x86_64 바이너리가 있습니까? 빌드 설정에 이상이 있거나 시뮬레이터 빌드를 업로드했습니다.
Stephen Darlington

@ pAkY88. 나는 할 수 없었다. 최근에 Shopify API 포럼에 게시했으며 응답을 기다리고 있습니다. 내가 하나를
만나면

Application Loader 3.5
SudoPlz를

답변:


395

문제는 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가 게시 한 수정 된 스크립트를 확인하십시오.


6
@ pAkY88 Xcode 프로젝트 에서이 스크립트를 사용하여 위에서 언급 한 App Store 문제를 해결했지만 이제 빌드로 이동하면 치명적인 오류가 많이 발생합니다-> 치명적인 오류 : lipo : 입력 파일 (/ ... -extract 옵션이 지정된 경우 Frameworks / Bolts.framework / Bolts)는 팻 파일이어야합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
SamoanProgrammer

52
앱이 시뮬레이터와 장치에서 모두 실행되도록 arm + x86을 결합해야하고 x86을 제거하여 앱 스토어에 제출해야합니다. x86이 감지되는 한 Apple이 왜 스트립을 끝내지 않습니까? 그들은 이것을 방어하는 많은 기술적 이유를 도울 수 있지만, 사용자 친화적이지 않기 때문에 사업상의 이유는 없습니다.
superarts.org

5
@Skoua 관련 대상을 선택한 다음 "Build Phases"를 선택하고 "Embed Frameworks"작업 뒤에 배치
Piotr Tobolski

6
위의 스크립트는 유용하지만 Xcode에서 스크립트를 실행하는 단계에 대해서는 언급되지 않았습니다. 이 스크립트를 실행하려면 대상-> 빌드 단계를 선택한 다음 Xcode에서 상단 헤더를 선택하십시오. 편집기-> 빌드 단계 추가-> 실행 스크립트 추가 빌드 단계를 탭하면 TARGET의 빌드 단계 섹션에 열이 표시됩니다. 여기에서 스크립트 위에 붙여 넣기를 복사하여 Appstore에 업로드 할 수 있습니다.
shashi Gupta

5
Xcode 11.2에서 작동하지 않습니다-아무도 해결책을 찾았습니까?
JMIT

179

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"가 아님).

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


1
아이디어 주셔서 감사합니다. while 루프 내에서 허용 된 답변의 코드에 단순히 검사를 추가 case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esac했으며 매력처럼 작동했습니다.
Michael Radionov

이 스크립트를 추가하고 TARGET -> Build Phases -> [CP] Embedded Pods Frameworks있지만 작동하지 않고 여전히 iTunesConnect 오류에 업로드했습니다. 이 스크립트를 실행하는 방법?
PiterPan

2
PiterPan, 별도 RunScript 단계로 추가
Varrry

1
방금 "설치할 때만 스크립트 실행"옵션을 확인한 후 보관을 제외하고 건너 뜁니다.
Rivera

여기에 제안 된 모든 것이 카르타고 오류를 해결했습니다. 그러나 실패한 이유에 대한 유용한 정보를 얻기 위해 유효성 검증없이 App Store를 업로드해야했습니다. 그것을 해결하고 앞으로 이동 관리 ...
user3069232

90

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이 복사되도록합니다.


추가 참고 사항으로, 최근에 미리 컴파일 된 이전 버전의 타사 프레임 워크를 사용하지 않고 Carthage를 사용하여 설치된 동일한 프레임 워크의 새로운 버전으로 전환 하여이 문제에 부딪 쳤습니다. 카르타고가 완전히 설정 되었어도이 오류가 계속 발생합니다. 나를 위해 수정은 프로젝트에서 프레임 워크를 완전히 제거하고 다시 추가하는 것이 었습니다. Carthage를 사용하고 있는데이 답변으로 문제가 해결되지 않으면 해보십시오.
Ash

1
사실, 좋은 소식입니다. 종종 가장 좋은 방법은 단순히 모든 프레임 워크를 제거하고 Carthage에서 모든 프레임 워크를 다시 추가하는 것입니다. 건배
Fattie

나는 카르타고와 원수를 사용하여 추가 해요 $(SRCROOT)/Carthage/Build/iOS/Marshal.framework했던 일을
리카르도 Mutti

현대 iOS에서는 99 %의 시간이 문제입니다. 복사 프레임 워크를 잊어 버렸습니다. (현재 프로젝트의 100 %가 카르타고를 사용합니다.)
Fattie

41

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

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


5
이 답변에는 더 많은 투표가 있어야합니다. 많은 사람들이 카르타고를 사용하는 근본 원인이라고 생각합니다.
mm2001

15
동적 프레임 워크를 임베드하려는 경우이를 제거하면 다음과 같은 오류 메시지가 표시됩니다. "이유 : 이미지를 찾을 수 없음"
electronix384128

1
이것은 나를 위해 일했습니다. Embedded Binaries에서 프레임 워크를 제거하고 링크 된 프레임 워크 및 라이브러리에 추가하면됩니다. 또한 다른 답변에서 찾은 스크립트를 실행하는 것과 같은 다른 작업을 수행해야합니다.
smileBot

33

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


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

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

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

  • 복사 프레임 워크에 넣어

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


이 방법으로 내 문제. 감사합니다.
DookieMan

15

아래 단계를 사용하여 프레임 워크에서 [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 ...

lipo 명령을 사용하여 제거한 후 @mahipal Singh .. 시뮬레이터에서 앱이 작동하지 않습니다. iPhone 시뮬레이터에서 x84_64와 같은 오류가 발생했습니다. 그러나 실제 장치에서 잘 작동합니다.
Hitarth

이 시뮬레이터 만 지원 디버그 프레임 워크 때문이다
마 히펄 싱

14

나는 여기에 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가 프로젝트 의 폴더에 있으면 수락 된 답변을보십시오.


스크립팅을 원하지 않는 사람들을위한 간단한 솔루션.

위의 명령을 실행하면 아치 크기가 절반으로 줄어 듭니다. 희망적으로 약간의 차이를 만듭니다.
showmyroutes

모든 것이 정상적으로 작동하도록 스크립트를 배포했지만 문제를 해결하는 방법에 대한 적절한 설명이어야합니다.
Sharkes Monken

이 답변의 본질을 사랑하십시오. 깨끗하고 간결한
Hudi Ilfeld

10

스크립트를 추가하고 프레임 워크를 몇 번 업데이트 한 후에도 동일한 문제가 발생했습니다.

xCode에서 스크립트가 포함 후 끝에 추가되었는지 확인하십시오. 임베디드 프레임 워크 전에 실수로 스크립트를 이동했다고 생각합니다.

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

참고 : xCode 9.1이 있습니다.


이것은 나를 위해 일했습니다. @ pAkY88의 스크립트는 지난 1 년 전에 거의 릴리스를했을 때 충분했습니다.
RedHotPawn.com

나는 같은 문제가 있었고 이것이 나를 위해 일했다. 프레임 워크를 제거하고 추가 할 때마다 실행 스크립트의 위치를 ​​확인하십시오 (제거 된 프레임 워크가 하나만있는 경우에만 필요).
Baran Emre

당신은 내 하루를 저장합니다. 임베디드 프레임 워크 후에 스크립트를 추가하기 만하면됩니다.
Mayuri R Talaviya

8

Xcode 10.1 용으로 업데이트되었습니다. 아래 솔루션이 저에게 효과적이었습니다.

Embedded Binaries에서 프레임 워크를 제거하고 Linked Frameworks and Libraries에 추가하면됩니다.

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

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


1
나를위한 근무 솔루션 (y)
Alok

이 링크 된 프레임 워크와 라이브러리에서 동일한 제거
RANU Dhurandhar

8

위의 모든 답변에 감사드립니다. 다음은 swift 4.2 및 5를 사용하는 스크립트 입니다. Your_Framework_Name 문자열을 Framework의 원래 이름으로 바꾸십시오.

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

감사합니다! 받아 들인 대답은 그렇지 않지만 이것은 나를 위해 일했습니다.
besserwisser

5

이 문제는 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

4

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

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

이제 유일한 문제는 SIMULATOR 에서 테스트 목적으로 RELEASE 빌드를 실행할 수 없다는 것 입니다. 그러나 아치를 제거하는 것처럼 원하는 경우 다시 추가 할 수 있습니다.


1
예, 그 해결책입니다.
Ofir Malachi

3

나를 위해 일한 간단한 해결책은

1- 임베디드 프레임 워크에서 프레임 워크를 제거합니다.

2- 프레임 워크를 연결된 프레임 워크로 추가

끝난!


1

이 오류 (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

1

나는 같은 문제가 있었다. 주어진 Run Script를 추가 한 후에도 작동하지 않았습니다. Xcode 관련 문제였습니다. Xcode 버전 9.0을 사용하고 있었지만 최신 버전은 9.2였습니다.

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


0

프레임 워크에는 코드 ARMx86코드 가 모두 포함되어 있어 장치 또는 시뮬레이터에서 사용할 수 있습니다. 앱을 App Store에 제출하려면 다음 스크립트를 실행하여 바이너리에서 비활성 코드를 제거하십시오.

1. 프로젝트 네비게이터에서 대상을 선택하고 프로젝트 편집기 상단에서 빌드 단계를 클릭하십시오.

2. Editor 메뉴에서 Add Build Phase를 선택한 다음 Run Run Build Build Phase를 선택하십시오 (또는 Build Phases 편집기의 왼쪽 상단 모서리에있는 + 버튼을 클릭하십시오).

3. 방금 추가 된 새로운 Run Script 빌드 단계 옆에있는 펼침 삼각형을 확장합니다. 스크립트 편집기 상자에 다음을 붙여 넣습니다. bash

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


이것은 strip-frameworks.sh 스크립트가 존재한다고 가정합니다.
Codezy

0

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

# 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"

이 스크립트를 프로젝트 대상의 "빌드 단계"프로젝트에 추가하십시오. "설치할 때만 스크립트 실행"확인란을 선택하십시오.

샘플 스크립트 삽입 위치 미리보기

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