ऐप स्टोर के मुद्दों पर सबमिट करें: असमर्थित आर्किटेक्चर x86


253

इसलिए मैं Shopify API का उपयोग करने का प्रयास कर रहा हूं। जब मैं ऐप को आर्काइव करता हूं और इसे वेरिफाई करता हूं तो कोई समस्या नहीं होती है लेकिन जब मैं इसे ऐप स्टोर में जमा करता हूं तो यह मुझे निम्न मुद्दे देता है।

  1. त्रुटि ITMS-90087: "असमर्थित वास्तुकला। आपके निष्पादन योग्य में असमर्थित वास्तुकला '[x86_64, i386]' है।"
  2. ERROR ITMS-90209: "अमान्य खंड संरेखण। SJAPP.app/Frameworks/Buy.framework/Buy पर ऐप बाइनरी में उचित खंड संरेखण नहीं है। नवीनतम Xcode संस्करण के साथ ऐप के पुनर्निर्माण का प्रयास करें।" (मैं पहले से ही नवीनतम संस्करण का उपयोग कर रहा हूं।)
  3. त्रुटि ITMS-90125: "बाइनरी अमान्य है। LC_ENCRYPTION_INFO लोड कमांड में एन्क्रिप्शन जानकारी या तो गायब है या अमान्य है, या बाइनरी पहले से ही एन्क्रिप्टेड है। यह बाइनरी ऐप्पल के लिंकर के साथ बनाया गया नहीं लगता है।"
  4. चेतावनी देने वाले ITMS-90080: "निष्पादन योग्य पेलोड /..../ Buy.framework एक स्थिति स्वतंत्र निष्पादन योग्य नहीं है। कृपया सुनिश्चित करें कि PIR निष्पादन योग्य बनाने के लिए ur build settings को कॉन्फ़िगर किया गया है।"

4
पहला संदेश लगता है जैसे कि यह एक सिम्युलेटर बिल्ड है।
फिलिप मिल्स

जब मैं सबमिशन के लिए एक आर्काइव बनाता हूं तो मैं डिवाइसेस ऑप्शन में iOS डिवाइस चुनता हूं, फिर एक आर्काइव बनाता हूं, अगर आप यही पूछ रहे हैं
सौरभ जैन

2
मैं @PhillipMills से सहमत हूं। अपनी पहली त्रुटि पर ध्यान लगाओ। आपके iOS ऐप में x86_64 बाइनरी क्यों है? या तो आपने अपनी बिल्ड सेटिंग्स के साथ कुछ अजीब किया है ... या आपने एक सिम्युलेटर बिल्ड अपलोड किया है।
स्टीफन डार्लिंगटन

@ pAkY88। मै नही कर सकता था। मैंने हाल ही में Shopify API फ़ोरम में पोस्ट किया है और मुझे प्रतिक्रिया का इंतजार है। अगर मैं एक के पार आता हूं तो निश्चित रूप से कुछ पोस्ट करूंगा
सौरभ जैन

जब मैंने एप्लीकेशन लोडर 3.5
सूडोप्ल्ज़

जवाबों:


395

समस्या यह है कि खरीदें ढांचे में सिम्युलेटर (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 द्वारा पोस्ट की गई संशोधित स्क्रिप्ट को देखते हैं, क्योंकि इसमें कुछ मामूली मुद्दे हैं।


6
@ pAkY88 ने ऊपर बताए गए ऐप स्टोर के मुद्दों को ठीक करने के लिए अपने Xcode प्रोजेक्ट में इस स्क्रिप्ट का उपयोग किया है, लेकिन अब जब मैं बिल्ड में जाता हूं, तो मेरे पास घातक त्रुटियों का एक बहुत है -> घातक त्रुटि: लाइपो: इनपुट फ़ाइल (/ ... फ्रेमवर्क / Bolts.framework / बोल्ट) एक मोटी फ़ाइल होनी चाहिए जब -extract विकल्प निर्दिष्ट किया जाता है। इसे ठीक करने का कोई तरीका?
सामोनप्रोग्राम 16

52
मुझे लगता है कि यह बहुत बेवकूफ है: आपको अपने ऐप को सिम्युलेटर और डिवाइस दोनों पर चलाने की अनुमति देने के लिए हाथ + x86 को संयोजित करना होगा, और ऐप स्टोर में जमा करने के लिए x86 को बाहर निकालना होगा। जब तक x86 का पता नहीं चलता तब तक Apple उनके छोर पर पट्टी क्यों नहीं करता? वे इसका बचाव करने के लिए बहुत से तकनीकी कारणों की मदद कर सकते हैं, लेकिन कोई भी व्यावसायिक कारण नहीं है क्योंकि यह उपयोगकर्ता के अनुकूल नहीं है।
superarts.org

5
@ सोकौआ प्रासंगिक लक्ष्य का चयन करें, फिर "चरणों का निर्माण करें" और "एंबेड फ्रेमवर्क" एक्शन के बाद इसे
डालें

6
उपरोक्त स्क्रिप्ट मददगार है लेकिन Xcode में स्क्रिप्ट को चलाने के चरणों के बारे में कहीं नहीं बताया गया है। इस स्क्रिप्ट को चलाने के लिए TARGETS -> बिल्ड फेज चुनें फिर एडिटर पर Xcode टैप में ऊपरी हेडर चुनें -> बिल्ड फेज जोड़ें -> रन स्क्रिप्ट स्क्रिप्ट बनाएँ फेज जोड़ें और आपको TARETET के बिल्ड फेज सेक्शन में एक कॉलम मिलेगा। यहां आप स्क्रिप्ट के ऊपर पेस्ट कॉपी कर सकते हैं और इसे ऐपस्टोर पर सफलतापूर्वक अपलोड कर सकते हैं।
शशि गुप्ता

5
Xcode 11.2 में काम नहीं कर रहा है - किसी को भी एक समाधान मिला?
14 मई को JMIT

180

PAkY88 द्वारा दिए गए उत्तर काम करता है, लेकिन मुझे https://stackoverflow.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 स्लाइस को वसा बाइनरी (यदि वे मौजूद है) से हटाती है यदि सिम्युलेटर के लिए नहीं चल रहा है (इसका मतलब है कि गंतव्य फ़ोल्डर "डीबग-आईफ़ोनह्यूलेटर" की तरह नहीं है)।

क्षमा करें, मैं शेल स्क्रिप्ट से परिचित नहीं हूं, इसलिए हो सकता है कि कोई व्यक्ति इसे अधिक सुरुचिपूर्ण तरीके से लिख सके। लेकिन यह काम करता है)


1
विचार के लिए आपका धन्यवाद। मैंने बस लूप के अंदर स्वीकार किए गए उत्तर से कोड में एक चेक जोड़ा है case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacऔर यह एक आकर्षण की तरह काम करता है।
माइकल रेडियोनोव

मैं इस स्क्रिप्ट को जोड़ रहा हूं, TARGET -> Build Phases -> [CP] Embedded Pods Frameworksलेकिन यह काम नहीं करता है और मेरे पास अभी भी iTunesConnect त्रुटियों के लिए अपलोड है। इस स्क्रिप्ट को कैसे चलाना है?
पितृपक्ष

2
PiterPan, इसे अलग रनस्क्रिप्ट चरण के रूप में जोड़ें
Varrry

1
मैंने सिर्फ "रन स्क्रिप्ट को केवल इंस्टॉल करते समय" चेक किया था और यह आर्काइव करने के अलावा छोड़ दिया जाता है।
रिवेरा

क्या यहां सब कुछ सुझाया गया था, कार्थेज त्रुटि को दूर करने में कामयाब; लेकिन यह बिना असफल होने के लिए कुछ उपयोगी जानकारी प्राप्त करने के लिए सत्यापन के बिना ऐप स्टोर को अपलोड करने की आवश्यकता है। इसे ठीक करने और आगे बढ़ने का प्रबंधन ...
user3069232

90

यदि आप कार्थेज का उपयोग कर रहे हैं तो आप इस समस्या का अनुभव कर सकते हैं क्योंकि परियोजना है:

  • carthage copy-frameworksनिर्माण चरण गुम ।
  • या बिल्ड चरण में सभी चौखटे (अधूरी सूची) शामिल नहीं हैं।

यह क्रिया मान्य आर्किटेक्चर (कोड) की एक सूची को फ़िल्टर करती है

कॉपी-फ्रेम की स्थापना चरण का निर्माण करती है

IOS स्टेप्स के लिए Carthage बिल्डिंग से :

अपने एप्लिकेशन लक्ष्य '' चरण बनाएँ '' सेटिंग टैब पर, "+" आइकन पर क्लिक करें और "नया रन स्क्रिप्ट चरण" चुनें। एक रन स्क्रिप्ट बनाएं जिसमें आप अपना शेल निर्दिष्ट करें (उदा: बिन / श), निम्न सामग्री को शेल के नीचे स्क्रिप्ट क्षेत्र में जोड़ें:

/usr/local/bin/carthage copy-frameworks

और "इनपुट फ़ाइलें" के अंतर्गत आपके द्वारा उपयोग किए जाने वाले चौखटों में पथ जोड़ें, जैसे:

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

यह स्क्रिप्ट सार्वभौमिक बायनेरिज़ द्वारा ट्रिगर किए गए ऐप स्टोर सबमिशन बग के चारों ओर काम करती है और यह सुनिश्चित करती है कि संग्रह करते समय आवश्यक बिटकोड से संबंधित फाइलें और dSYMs कॉपी किए जाते हैं।


एक अतिरिक्त नोट के रूप में, मैं हाल ही में इस समस्या में चला गया था कि तीसरे पक्ष के ढांचे के एक पुराने, पूर्व-संकलित संस्करण का उपयोग करके स्विच किया गया था, कार्टहाज का उपयोग करके स्थापित उसी ढांचे के एक नए संस्करण में। एक बार जब कार्थेज पूरी तरह से सेट हो गया, तब भी मुझे यह त्रुटि मिलती रही। मेरे लिए, यह तय था कि परियोजना से ढांचे को पूरी तरह से हटा दिया जाए और इसे फिर से जोड़ा जाए। यदि आप कार्थेज का उपयोग कर रहे हैं और यह उत्तर आपके लिए ठीक नहीं है, तो ऐसा करने का प्रयास करें।
ऐश

1
सचमुच, एक महान पद। ध्यान दें, अक्सर आपका सबसे अच्छा दांव बस सभी रूपरेखाओं को हटा देता है, और फिर से कार्टाज से अपने सभी ढांचे को जोड़ना शुरू करें। चीयर्स
फेटी

मैं कार्थेज और मार्शल का उपयोग कर रहा हूं और जोड़ने $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkका काम किया है
रिकार्डो मुटी

आधुनिक आईओएस में, 99% यह समस्या है - आप कॉपी-फ्रेम को भूल गए। (100% परियोजनाएँ अब कार्थेज का उपयोग करती हैं।)
फेटी

41

मैंने एंबेडेड बायनेरिज़ अनुभाग (Xcode लक्ष्य -> ​​सामान्य टैब) से एक फ्रेमवर्क (उत्कृष्ट SVProgressHUD) को हटाकर त्रुटि ITMS-90080 को हल किया।

यहां छवि विवरण दर्ज करें


5
इस उत्तर में और भी कई बदलाव होने चाहिए। मुझे संदेह है कि कार्थेज का उपयोग करने वाले कई लोगों के लिए यह मूल कारण है।
mm2001

15
यदि आप एक डायनामिक फ्रेमवर्क को एम्बेड करने की कोशिश कर रहे हैं, तो यह मेरे लिए इस त्रुटि संदेश को निकालता है: "कारण: छवि नहीं मिली"
इलेक्ट्रॉनिक्स

1
इसने मेरे लिए काम किया। आपको एंबेडेड बायनेरिज़ से फ्रेमवर्क को निकालना होगा और इसे लिंक्ड फ्रेमवर्क और लाइब्रेरी में जोड़ना होगा। साथ ही, आपको अन्य सामान करना होगा जैसे स्क्रिप्ट को चलाने के लिए जो आपको दूसरे उत्तरों में मिलती है।
मुस्कानबोट

33

यदि आप उपयोग कर रहे हैं Carthageतो सुनिश्चित करें कि आपके Embed Frameworks Build Stepपहले हैCarthage copy-frameworks


कुछ असामान्य मामलों में (उदाहरण: Lottie-iOS फ्रेमवर्क):

  • आपके पास यह हमेशा की तरह "लिंक लाइब्रेरी" में होगा।

  • हालांकि आप करने के लिए है भी स्पष्ट रूप से "एम्बेड फ़्रेमवर्क" में यह जोड़ने के लिए, (भले ही है कि व्यर्थ लगता है, क्योंकि यह पूरी तरह से काम करता है तो आप इसे केवल "एम्बेड फ़्रेमवर्क" में है जब)

  • और इसे कॉपी-फ्रेमवर्क में डाल दिया

  • और कॉपी-फ्रेम सुनिश्चित करें "एंबेड फ्रेमवर्क" के बाद


इस तरह मेरा मुद्दा। धन्यवाद।
डोकीमैन

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. अब अपने प्रोजेक्ट को फिर से खोलें, क्लीन, बिल्ड एंड रन और क्रिएट आर्काइव ...

@ महीपाल सिंह .. लाइपो कमांड का इस्तेमाल करने के बाद हटा ऐप सिम्युलेटर में काम नहीं कर रहा है। iPhone सिम्युलेटर के लिए x84_64 की तरह त्रुटि मिली। लेकिन असली डिवाइस में ठीक काम कर रहा है।
हितार्थ

इसका कारण यह है कि सिम्युलेटर केवल डिबग फ्रेमवर्क का समर्थन करता है
मारीपाल सिंह

14

मैं यहां अपने 2 सेंट जोड़ूंगा (कम डरावने तरीके से :-))। मुझे विक्रेताओं से काफी संख्या में वसा पुस्तकालयों का सामना करना पड़ा है जो (किसी कारण से) उन्हें FrameworksApple द्वारा दस्तावेज के रूप में निर्देशिका में जोड़कर सामान्य तरीके से काम नहीं करते हैं । जिस तरह से हम उन्हें काम करने में सक्षम .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

यह पुष्टि करता है कि आपको "वसा को ट्रिम" करने की आवश्यकता होगी (अर्थात् i386&x86_64 iTunesConnect अभिलेखीय अपलोड से पहले आपको अपने ढांचे से ) , जो इन आर्किटेक्चर को अनुमति नहीं देता है (क्योंकि वे 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 पर एप्लिकेशन लोडर अभिलेखीय अपलोड में एक हरे रंग की जांच चिह्न देखना चाहिए।

ध्यान रखने योग्य बातें : उपरोक्त कदमों का निर्माण उत्पादन करते समय ही किया जाना चाहिए, क्योंकि .frameworkसिम्युलेटर आर्किटेक्ट्स से वसीयत छीन ली जाएगी, सिमुलेटरों पर निर्माण काम करना बंद कर देगा (जो अपेक्षित है)। विकास के माहौल में, .frameworkफ़ाइल के आर्किटेक्चर को बंद करने की आवश्यकता नहीं होनी चाहिए क्योंकि आप सिम्युलेटर और भौतिक उपकरण दोनों पर परीक्षण करना चाहते हैं। यदि आपका मोटा पुस्तकालय Frameworksप्रोजेक्ट में फ़ोल्डर में रहता है, तो कृपया स्वीकृत उत्तर देखें।


उन लोगों के लिए सरल समाधान जो स्क्रिप्टिंग की तरह महसूस नहीं करते हैं।

बस ऊपर दिए गए कमांड को चलाएं, आर्च का आकार आधा हो गया। उम्मीद है कि कुछ फर्क पड़ता है।
शो

भले ही मैंने स्क्रिप्ट को हर काम को सामान्य बनाने के लिए तैनात किया है, लेकिन इस मुद्दे को हल करने के तरीके पर एक उचित विवरण होना चाहिए।
मोनकेन

इस उत्तर की प्रकृति से प्यार करें। स्वच्छ और संक्षिप्त
हुडी इलफेल्ड

10

स्क्रिप्ट जोड़ने और फ्रेमवर्क को कुछ समय अपडेट करने के बाद भी मेरे पास एक ही मुद्दा था।

सुनिश्चित करें कि xCode में स्क्रिप्ट अंत के बाद जोड़ा गया है, एम्बेड के बाद। मुझे लगता है कि मैंने गलती से स्क्रिप्ट को एम्बेडेड ढांचे से पहले स्थानांतरित कर दिया था।

यहां छवि विवरण दर्ज करें

नोट: मेरे पास xCode 9.1 है


इसने मेरे लिए काम किया। जहां सिर्फ @ pAkY88 की स्क्रिप्ट ही पिछली बार पर्याप्त थी, मैंने लगभग एक साल पहले रिलीज किया था।
RedHotPawn.com

मेरे पास एक ही मुद्दा था और यह मेरे लिए काम करता था। रन स्क्रिप्ट की स्थिति की जाँच करना सुनिश्चित करें हर बार जब एक रूपरेखा को हटा दिया जाता है और जोड़ा जाता है (केवल तब आवश्यक होता है जब केवल एक ढाँचा हटा दिया जाता है)।
बारां इमरे

तुम मेरा दिन बचाओ। बस एम्बेडेड फ्रेमवर्क के बाद स्क्रिप्ट जोड़ने के लिए।
मयूरी आर तलाविया

8

नीचे दिए गए समाधान के लिए Xcode 10.1 अपडेट किया गया है:

बस आपको एंबेडेड बायनेरिज़ से फ्रेमवर्क को निकालना होगा और इसे लिंक्ड फ्रेमवर्क और लाइब्रेरी में जोड़ना होगा।

स्क्रीनशॉट के नीचे देखें;

यहां छवि विवरण दर्ज करें


1
मेरे लिए काम करने वाला समाधान (y)
आलोक

यह जुड़े हुए ढाँचों और पुस्तकालयों से समान को हटाता है
रानू धुरंधर

8

उपरोक्त सभी उत्तरों के लिए धन्यवाद। यहाँ एक स्क्रिप्ट है जो तेजी से 4.2 और 5 के साथ काम कर रही है । अपने फ्रेमवर्क के मूल नाम के साथ Your_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

धन्यवाद! इसने मेरे लिए काम किया, जबकि स्वीकृत उत्तर नहीं दिया।
बेसेरविसेर

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
हाँ, वह समाधान।
अमीर मलाकी

3

मेरे लिए काम करने वाला सरल उपाय था

1- एम्बेडेड फ्रेमवर्क से ढांचे को हटा दें।

2- फ्रेमवर्क को लिंक्ड फ्रेमवर्क के रूप में जोड़ें

किया हुआ!


1

यह त्रुटि (ITMS-90240) एक स्थिर (.A) लाइब्रेरी के कारण भी हो सकती है। एक स्क्रिप्ट अतिरिक्त आर्किटेक्चर पट्टी करने के लिए। Xcode में इसे Target> BuildPhases> + पर क्लिक करें और रन स्क्रिप्ट चुनें। फिर इसे स्क्रिप्ट बॉक्स में पेस्ट करें।

स्क्रिप्ट .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

मेरा भी यही मुद्दा था। यहां तक ​​कि यह दिए गए रन स्क्रिप्ट को जोड़ने के बाद भी काम नहीं कर रहा था। यह एक्सकोड से संबंधित मुद्दा था। मैं xcode संस्करण 9.0 का उपयोग कर रहा था लेकिन नवीनतम संस्करण 9.2 था।

इसलिए मैंने नवीनतम Xcode (9.2) स्थापित किया और यह काम कर गया।


0

आपके ढांचे में कोड ARMऔर x86कोड दोनों शामिल हैं , जो आपको किसी डिवाइस पर या सिम्युलेटर में इसका उपयोग करने की अनुमति देता है। यदि आप अपने ऐप को ऐप स्टोर में जमा करने का इरादा रखते हैं, तो बाइनरी से निष्क्रिय कोड को हटाने के लिए निम्न स्क्रिप्ट चलाएँ।

1. प्रोजेक्ट नेविगेटर में अपने लक्ष्य का चयन करें, और प्रोजेक्ट संपादक के शीर्ष पर बिल्ड चरण क्लिक करें।

2. संपादक मेनू से, ऐड बिल्ड चरण का चयन करें, फिर रन स्क्रिप्ट बिल्ड चरण जोड़ें (या बिल्ड चरणों संपादक के ऊपरी-बाएँ कोने में + बटन पर क्लिक करें)।

3. नया रन स्क्रिप्ट बिल्ड चरण के बगल में प्रकटीकरण त्रिकोण को जोड़ें जो अभी जोड़ा गया था। स्क्रिप्ट एडिटर बॉक्स में, निम्न पेस्ट करें: बैश

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


यह मानता है कि स्ट्रिप -फ्रैमवर्कसेश लिपि होती है ...
कोडज़ी

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"

इस स्क्रिप्ट को अपने प्रोजेक्ट लक्ष्य के "बिल्ड चरण" बनाएँ। बॉक्स की जांच करना सुनिश्चित करें: "इंस्टॉल करते समय केवल स्क्रिप्ट चलाएँ"

नमूना स्क्रिप्ट सम्मिलित करने के लिए कहां का पूर्वावलोकन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.