ios - ऐप स्टोर के मुद्दों पर सबमिट करें: असमर्थित आर्किटेक्चर x86
xcode (12)
नीचे दिए गए समाधान के लिए Xcode 10.1 अपडेट किया गया है:
बस आपको एंबेडेड बायनेरिज़ से फ्रेमवर्क को निकालना होगा और इसे लिंक्ड फ्रेमवर्क और लाइब्रेरी में जोड़ना होगा।
स्क्रीनशॉट के नीचे देखें;
इसलिए मैं shopify API का उपयोग करने का प्रयास कर रहा हूं। जब मैं ऐप को आर्काइव करता हूं और इसे वेरिफाई करता हूं तो कोई समस्या नहीं होती है लेकिन जब मैं इसे ऐप स्टोर में जमा करता हूं तो यह मुझे निम्न मुद्दे देता है।
- त्रुटि ITMS-90087: "असमर्थित वास्तुकला। आपके निष्पादन योग्य में असमर्थित वास्तुकला '[x86_64, i386]' है।"
- ERROR ITMS-90209: "अमान्य खंड संरेखण। SJAPP.app/Frameworks/Buy.framework/Buy पर ऐप बाइनरी में उचित खंड संरेखण नहीं है। नवीनतम xcode संस्करण के साथ एप्लिकेशन के पुनर्निर्माण का प्रयास करें।" (मैं पहले से ही नवीनतम संस्करण का उपयोग कर रहा हूं।)
- त्रुटि ITMS-90125: "बाइनरी अमान्य है। LC_ENCRYPTION_INFO लोड कमांड में एन्क्रिप्शन जानकारी या तो गायब है या अमान्य है, या बाइनरी पहले से ही एन्क्रिप्टेड है। यह बाइनरी ऐप्पल के लिंकर के साथ बनाया नहीं लगता है।"
- चेतावनी ITMS-90080: "निष्पादन योग्य पेलोड / / / Buy.framework एक स्थिति स्वतंत्र निष्पादन योग्य नहीं है। कृपया सुनिश्चित करें कि PIE निष्पादक बनाने के लिए ur build settings को कॉन्फ़िगर किया गया है।"
PAkY88 द्वारा दिए गए Answer काम करता है, लेकिन मुझे https://.com/a/35240555/5272316 में मारियो ए गुज़मैन के रूप में एक ही समस्या का सामना करना पड़ा: एक बार जब हम अप्रयुक्त आर्किटेक्चर काटते हैं तो हम स्क्रिप्ट को नहीं चला सकते हैं क्योंकि यह हटाने की कोशिश करता है मौजूदा स्लाइस नहीं, क्योंकि हर बार एक्सकोड बाइनरी को फिर से एम्बेड नहीं करता है। आइडिया था - आर्काइव के लिए बिल्डिंग बनाते समय 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 स्लाइस को वसा बाइनरी (यदि वे मौजूद है) से हटाती है यदि सिम्युलेटर के लिए नहीं चल रहा है (इसका मतलब है कि गंतव्य फ़ोल्डर "डीबग-आईफ़ोनह्यूलेटर" की तरह नहीं है)।
क्षमा करें, मैं शेल स्क्रिप्ट से परिचित नहीं हूं, इसलिए हो सकता है कि कोई व्यक्ति इसे अधिक सुरुचिपूर्ण तरीके से लिख सके। लेकिन यह काम करता है)
इस समस्या को 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.2 और 5 के साथ काम कर रही है
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
मेरा भी यही मुद्दा था। यहां तक कि यह दिए गए रन स्क्रिप्ट को जोड़ने के बाद भी काम नहीं कर रहा था। यह एक्सकोड से संबंधित मुद्दा था। मैं xcode संस्करण 9.0 का उपयोग कर रहा था लेकिन नवीनतम संस्करण 9.2 था।
इसलिए मैंने नवीनतम Xcode (9.2) स्थापित किया और यह काम कर गया।
मेरे लिए काम करने वाला सरल उपाय था
1- एम्बेडेड फ्रेमवर्क से ढांचे को हटा दें।
2- फ्रेमवर्क को लिंक्ड फ्रेमवर्क के रूप में जोड़ें
किया हुआ!
मैंने बिल्ड सेटिंग्स - मान्य आर्किटेक्चर - रिलीज़ से आर्किटेक्चर i386 & x64_86 को हटा दिया, और सब कुछ ठीक काम किया।
अब एकमात्र मुद्दा यह होगा कि आप किसी SIMULATOR पर परीक्षण उद्देश्यों के लिए एक RELEASE बिल्ड नहीं चला सकते। लेकिन जितनी आसानी से आपने आर्क को हटाया, आप चाहें तो उन्हें वापस जोड़ सकते हैं।
यदि आप
Carthage
का उपयोग कर रहे हैं, तो सुनिश्चित करें कि
Carthage
copy-frameworks
से पहले आपका
Embed Frameworks
Build Step
है
कुछ असामान्य मामलों में (उदाहरण: Lottie-iOS फ्रेमवर्क):
-
आपके पास हमेशा की तरह "लिंक लाइब्रेरी" में होगा।
-
हालाँकि, आपको इसे "एंबेड फ्रेमवर्क" में स्पष्ट रूप से जोड़ना होगा (भले ही यह व्यर्थ लगता हो, क्योंकि यह पूरी तरह से काम करता है जब आपके पास केवल "एंबेड फ्रेमवर्क" हो)
-
और इसे कॉपी-फ्रेमवर्क में डाल दिया
-
और कॉपी-फ्रेम सुनिश्चित करें "एंबेड फ्रेमवर्क" के बाद
यह त्रुटि (ITMS-90240) एक स्थिर (.A) लाइब्रेरी के कारण भी हो सकती है। एक स्क्रिप्ट अतिरिक्त आर्किटेक्चर पट्टी करने के लिए। Xcode में इसे Target> BuildPhases> + पर क्लिक करें और रन स्क्रिप्ट चुनें। फिर इसे स्क्रिप्ट बॉक्स में पेस्ट करें।
स्क्रिप्ट .a फ़ाइलों की खोज करती है, यह देखने के लिए जांच करती है कि क्या इसमें एक अपमानजनक वास्तुकला है, तो यदि यह उस वास्तुकला के बिना एक .A फ़ाइल बनाता है।
MacOS के लिए:
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
IOS के लिए:
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
समस्या यह है कि खरीदें ढांचे में सिम्युलेटर (x86_64) और वास्तविक उपकरणों (एआरएम) दोनों के लिए एक निर्माण शामिल है।
बेशक, आपको असमर्थित आर्किटेक्चर के लिए ऐप स्टोर पर एक बाइनरी प्रस्तुत करने की अनुमति नहीं है, इसलिए समाधान को सबमिट करने से पहले, अंतिम बाइनरी से अनावश्यक आर्किटेक्चर को "मैन्युअल रूप से" हटा दें।
डैनियल केनेट एक अच्छा समाधान के साथ आया और इस स्क्रिप्ट को निर्माण चरण में जोड़ने के लिए प्रदान करता है :
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 द्वारा पोस्ट की गई संशोधित स्क्रिप्ट को देखते हैं, क्योंकि इसमें कुछ मामूली मुद्दे हैं।