그래서 Shopify API를 사용하려고합니다. 앱을 보관하고 유효성을 검사하면 문제가 없지만 앱 스토어에 제출하면 다음과 같은 문제가 발생합니다.
- 오류 ITMS-90087 : “지원되지 않는 아키텍처. 실행 파일에 지원되지 않는 아키텍처 ‘[x86_64, i386]’이 (가) 있습니다.”
- 오류 ITMS-90209 : “잘못된 세그먼트 정렬. SJAPP.app/Frameworks/Buy.framework/Buy의 앱 바이너리에 올바른 세그먼트 정렬이 없습니다. 최신 Xcode 버전으로 앱을 다시 빌드하십시오.” (나는 이미 최신 버전을 사용하고 있습니다.)
- 오류 ITMS-90125 : “이진 파일이 유효하지 않습니다. LC_ENCRYPTION_INFO로드 명령의 암호화 정보가 없거나 유효하지 않거나 이진 파일이 이미 암호화되어 있습니다.이 이진 파일은 Apple의 링커로 빌드되지 않은 것 같습니다.”
- 경고 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] 은 시뮬레이터에 사용됩니다.
-
열다
Terminal
-
각 프레임 워크의 프로젝트 드래그 경로를 터미널로 엽니 다.
예 :
cd /Users/MAC/Desktop/MyProject/Alamofire.framework
-
아래 명령에서 프레임 워크 이름을 설정하고 실행하십시오.
lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire
- 이제 프로젝트를 다시 열어 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
아키텍처를 제거하는 매우 간단한 방법이 있습니다.
-
프로젝트 디렉토리에서 터미널을 엽니 다.
-
직접으로 변경 디렉토리
.framekwork
처럼,cd YourProjectDir/YourProject/YourLibrary.framework
-
아래와 같이 일련의 명령을 실행하십시오.
$ 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_64
i386
명심해야 할 사항 : .framework
시뮬레이터 아키텍처에서 제거 될 예정 이므로 시뮬레이터 빌드가 작동을 멈 춥니 다 (예상). 개발 환경에서는 .framework
시뮬레이터와 실제 장치 모두에서 테스트 할 수 있기 때문에 파일 에서 아키텍처를 제거 할 필요가 없습니다 . 뚱뚱한 라이브러리 Frameworks
가 프로젝트 의 폴더에 있으면 수락 된 답변을보십시오.