অ্যাপ স্টোর ইস্যুগুলিতে জমা দিন: অসমর্থিত আর্কিটেকচার x86


252

তাই আমি শপাইফাই এপিআই ব্যবহার করার চেষ্টা করছি। আমি যখন অ্যাপটি সংরক্ষণাগারভুক্ত করে এটিকে বৈধ করে তুলি তখন কোনও সমস্যা নেই তবে আমি যখন অ্যাপ স্টোরটিতে এটি জমা দিই তখন এটি আমাকে নিম্নলিখিত সমস্যাগুলি দেয়।

  1. আইটিএমএস-90087 এর ত্রুটি: "অসমর্থিত আর্কিটেকচার। আপনার এক্সিকিউটেবলে অসমর্থিত আর্কিটেকচার '[x86_64, i386]' রয়েছে" "
  2. ত্রুটি আইটিএমএস-90209: "অবৈধ বিভাগের প্রান্তিককরণ। এসজেএপিপি.এপ / ফ্রেমওয়ার্কস / বুয়.ফ্রেমওয়ার্ক / বুয় অ্যাপ্লিকেশন বাইনারিটির সঠিক সেগমেন্ট অ্যালাইনমেন্ট নেই the সর্বশেষতম এক্সকোড সংস্করণ দিয়ে অ্যাপটি পুনর্নির্মাণের চেষ্টা করুন" " (আমি ইতিমধ্যে সর্বশেষতম সংস্করণ ব্যবহার করছি))
  3. ত্রুটি আইটিএমএস-90125: "বাইনারিটি অবৈধ। এলসি_ইএনসিআরসিপিপিএনটিপিও লোড কমান্ডের এনক্রিপশন তথ্যটি হয় অনুপস্থিত বা অবৈধ, বা বাইনারি ইতিমধ্যে এনক্রিপ্ট করা আছে This এই বাইনারিটি অ্যাপলের লিঙ্কারের সাহায্যে নির্মিত হয়েছে বলে মনে হয় না।"
  4. সতর্কতা আইটিএমএস -৯৯০৮: "এক্সিকিউটেবল পেলোড / / / / কিনুন Buy ফ্রেমওয়ার্ক কোনও অবস্থান স্বতন্ত্র নির্বাহযোগ্য নয় Please দয়া করে নিশ্চিত করুন যে আপনার বিল্ড সেটিংসগুলি পিআইই এক্সিকিউটেবলগুলি তৈরি করতে কনফিগার করা হয়েছে are"

4
প্রথম বার্তাটি মনে হচ্ছে এটি একটি সিমুলেটর বিল্ড।
ফিলিপ মিলস

আমি যখন জমা দেওয়ার জন্য একটি সংরক্ষণাগার তৈরি করি তখন আমি ডিভাইসগুলির বিকল্পগুলিতে আইওএস ডিভাইসগুলি চয়ন করি তারপরে একটি সংরক্ষণাগার তৈরি করি, যদি আপনি যা জিজ্ঞাসা করছেন তা যদি হয়
সৌরভ জৈন

2
আমি @ ফিলিপমিলের সাথে একমত আপনার প্রথম ত্রুটি মনোনিবেশ করুন। আপনার আইওএস অ্যাপে আপনার কাছে কেন একটি x86_64 বাইনারি রয়েছে? হয় আপনি নিজের বিল্ড সেটিংসের সাথে অদ্ভুত কিছু করেছেন ... অথবা আপনি একটি সিমুলেটর বিল্ড আপলোড করেছেন।
স্টিফেন ডার্লিংটন

@ pAkY88। আমি সক্ষম ছিলাম না। আমি সম্প্রতি শপিফাই এপিআই ফোরামে পোস্ট করেছি এবং প্রতিক্রিয়াটির অপেক্ষায় রয়েছি। আমি যদি
সৌরভ জৈন

আমি অ্যাপ্লিকেশন লোডার 3.5
SudoPlz

উত্তর:


394

সমস্যাটি হ'ল বুক ফ্রেমওয়ার্কটিতে সিমুলেটর (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

আমি এটি ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করেছে।

সম্পাদনা: নিশ্চিত করুন যে আপনি ভারারি পোস্ট করেছেন পরিবর্তিত স্ক্রিপ্টটি দেখেছেন, কারণ এটিতে কিছু ছোটখাটো সমস্যা রয়েছে।


6
@ pAkY88 আমি উপরে উল্লিখিত অ্যাপ স্টোর সমস্যাগুলি সমাধান করতে আমার এক্সকোড প্রকল্পে এই স্ক্রিপ্টটি ব্যবহার করেছি, তবে এখন আমি যখন বিল্ডে যাই, তখন আমার অনেক মারাত্মক ত্রুটি হয় -> মারাত্মক ত্রুটি: লিপো: ইনপুট ফাইল (/ ... ফ্রেমওয়ার্ক / বোল্টস.ফ্রেমওয়ার্ক / বল্টস) -অক্ষেত্র বিকল্পটি নির্দিষ্ট করা হলে অবশ্যই একটি ফ্যাট ফাইল হতে হবে। এটা ঠিক করার কোন ধারনা তোমার আছ?
সামোয়ান প্রোগ্রামার

52
আমি মনে করি এটি বেশ বোকা: আপনার অ্যাপ্লিকেশনটি সিমুলেটর এবং ডিভাইস উভয়ই চলতে দেয় এবং আপনাকে অ্যাপ স্টোরে জমা দেওয়ার জন্য x86 বের করতে হবে, আপনাকে আর্ম + x86 একত্রিত করতে হবে। X86 সনাক্ত হওয়া অবধি অ্যাপল কেন তাদের শেষের স্ট্র্যাপটি করবে না? এটিকে রক্ষা করতে তারা অনেক প্রযুক্তিগত কারণগুলিতে সহায়তা করতে পারে তবে এটি কোনও ব্যবসায়ের কারণ নয় কারণ এটি মোটেই ব্যবহারকারী বান্ধব নয়।
superarts.org

5
@ স্কোয়া প্রাসঙ্গিক লক্ষ্যটি নির্বাচন করুন, তারপরে "পর্যায়গুলি তৈরি করুন" এবং "এম্বেড ফ্রেমওয়ার্কগুলি" কর্মের পরে রাখুন
পিয়োটার টোবোলস্কি

6
উপরের স্ক্রিপ্টটি সহায়ক তবে এক্সকোডে স্ক্রিপ্টটি চালানোর পদক্ষেপ সম্পর্কে কোথাও উল্লেখ নেই। এই স্ক্রিপ্টটি চালানোর জন্য টার্গেটগুলি -> এডকোভারে এক্সকোডে উপরের শিরোনামটি তৈরি করুন -> বিল্ড পর্যায়গুলি যুক্ত করুন -> রান স্ক্রিপ্ট যোগ করুন পর্যায়ক্রমে বিল্ড ফেজ করুন এবং আপনি টার্গেটের বিল্ড ফেজ বিভাগে একটি কলাম পাবেন। এখানে আপনি উপরের স্ক্রিপ্টের পেস্টটি অনুলিপি করতে এবং এটিকে অ্যাপস্টোরে সফলভাবে আপলোড করতে পারেন।
শশী গুপ্ত

5
এক্সকোড 11.2 এ কাজ করছেন না - কেউ সমাধান খুঁজে পেয়েছে?
জেএমআইটি

178

উত্তর 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

এই স্ক্রিপ্টটি কেবল সিমুলেটারের জন্য না চালিত হলে চর্বিযুক্ত বাইনারি (যদি তারা উপস্থিত থাকে) থেকে আই 386 এবং x86_64 স্লাইসগুলি সরিয়ে দেয় (যার অর্থ গন্তব্য ফোল্ডারটি "ডিবাগ-আইফোনেসিমুলেটর" এর মতো নয়)।

দুঃখিত, আমি শেল স্ক্রিপ্টগুলির সাথে পরিচিত নই, তাই কেউ এটিকে আরও মার্জিত উপায়ে লিখতে পারে। কিন্তু এটি কাজ করে)


1
ধারনাটির জন্য তোমাকে ধন্যবাদ। আমি কেবল লুপের অভ্যন্তরে গ্রহণযোগ্য উত্তর থেকে কোডটিতে একটি চেক যুক্ত করেছি case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacএবং এটি একটি কবজির মতো কাজ করেছে।
মাইকেল রাদিওনভ 4'17

আমি এই স্ক্রিপ্টটি এতে যুক্ত করছি TARGET -> Build Phases -> [CP] Embedded Pods Frameworksতবে এটি কার্যকর হয় না এবং আমি এখনও আইটিউনস সংযোগ ত্রুটিতে আপলোড করেছি। কিভাবে এই স্ক্রিপ্ট চালাতে?
পিটারপ্যান

2
পাইটারপ্যান, এটিকে পৃথক রানস্ক্রিপ্ট পর্ব হিসাবে যুক্ত করুন
ভ্যারি

1
আমি কেবল "ইনস্টল করার সময় কেবল স্ক্রিপ্ট চালান" বিকল্পটি পরীক্ষা করেছিলাম এবং সংরক্ষণাগারটি বাদ দিয়ে এড়িয়ে যায়।
রিভেরা

এখানে সবকিছু প্রস্তাবিত, কার্থেজ ত্রুটি সাফ করতে পরিচালিত; তবে কেন এটি ব্যর্থ হয়েছে সে সম্পর্কে কিছু দরকারী তথ্য পাওয়ার জন্য এটি বৈধতা ছাড়াই অ্যাপ স্টোরটি আপলোড করা দরকার। এটি ঠিক করার জন্য পরিচালিত হয়েছে এবং এগিয়ে চলছে ...
ব্যবহারকারীর 3069232

90

আপনি যদি কার্থেজ ব্যবহার করছেন তবে আপনি এই সমস্যাটি অনুভব করতে পারেন কারণ প্রকল্পটি হ'ল:

  • carthage copy-frameworksবিল্ড পর্বটি অনুপস্থিত ।
  • বা বিল্ড ফেজটিতে সমস্ত ফ্রেমওয়ার্ক অন্তর্ভুক্ত নেই (অসম্পূর্ণ তালিকা)।

এই ক্রিয়াটি বৈধ আর্কিটেকচারের (কোড) তালিকায় ফ্রেমওয়ার্কগুলি ফিল্টার করে ।

কপি-ফ্রেমওয়ার্কগুলি বিল্ড ফেজ সেট আপ করা হচ্ছে

আইওএস পদক্ষেপের জন্য কার্থেজ বিল্ডিং থেকে :

আপনার অ্যাপ্লিকেশন টার্গেটে "বিল্ড পর্যায়" সেটিংস ট্যাবটিতে, "+" আইকনটি ক্লিক করুন এবং "নতুন রান স্ক্রিপ্ট ফেজ" নির্বাচন করুন। একটি রান স্ক্রিপ্ট তৈরি করুন যেখানে আপনি নিজের শেলটি নির্দিষ্ট করেছেন (উদা: বিন / শ), শেলের নীচে স্ক্রিপ্টের অঞ্চলে নিম্নলিখিত সামগ্রীগুলি যুক্ত করুন:

/usr/local/bin/carthage copy-frameworks

এবং ফ্রেমওয়ার্কগুলিতে আপনি "ইনপুট ফাইলগুলি" এর অধীনে ব্যবহার করতে চান এমন পাথগুলি যুক্ত করুন, যেমন:

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

এই স্ক্রিপ্টটি সর্বজনীন বাইনারি দ্বারা চালিত অ্যাপ স্টোর জমা দেওয়ার বাগের চারপাশে কাজ করে এবং সংরক্ষণাগার স্থাপনের সময় প্রয়োজনীয় বিটকোড-সংক্রান্ত ফাইল এবং ডিএসওয়াইএম অনুলিপি করে তা নিশ্চিত করে।


অতিরিক্ত নোট হিসাবে, আমি সম্প্রতি তৃতীয় পক্ষের কাঠামোর একটি পুরানো, প্রাক-সংকলিত সংস্করণটি কার্থেজ ব্যবহার করে ইনস্টল করা একই কাঠামোর একটি নতুন সংস্করণে সরিয়ে নিয়ে এই সমস্যায় পড়েছি। এমনকি একবার কার্থেজ সম্পূর্ণরূপে সেট আপ হয়ে গেলেও আমি এই ত্রুটিটি পেতে থাকি। আমার জন্য, সমাধানটি ছিল পুরোপুরি প্রকল্প থেকে ফ্রেমওয়ার্কটি সরিয়ে আবার এটি আবার যুক্ত করা। আপনি যদি কার্থেজ ব্যবহার করছেন এবং এই উত্তরটি এটি আপনার পক্ষে ঠিক না করে, এটি করার চেষ্টা করুন।
অ্যাশ

1
প্রকৃতপক্ষে, একটি দুর্দান্ত পোস্ট। দ্রষ্টব্য, প্রায়শই আপনার সেরা বেটটি হ'ল সমস্ত ফ্রেমওয়ার্কগুলি সরিয়ে ফেলা হয় এবং কার্থেজ থেকে আপনার সমস্ত ফ্রেমওয়ার্কগুলি আবার যুক্ত করা শুরু করে। চিয়ার্স
ফ্যাটি

আমি কার্থেজ এবং মার্শাল ব্যবহার করছি এবং $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkকাজটি যুক্ত করছি
রিকার্ডো মুট্টি

আধুনিক আইওএসে, 99% সময় এই সমস্যাটি - আপনি কেবল অনুলিপি-ফ্রেমওয়ার্কগুলি ভুলে গেছেন। (প্রকল্পের 100% এখন কার্থেজ ব্যবহার করে))
ফ্যাটি

41

আমি এম্বেডড বাইনারি বিভাগ (এক্সকোড লক্ষ্য -> সাধারণ ট্যাব) থেকে একটি ফ্রেমওয়ার্ক (দুর্দান্ত এসভিপ্রোগ্রেসএইচডি) সরিয়ে আইটিএমএস -90080 ত্রুটিটি সমাধান করেছি।

এখানে চিত্র বর্ণনা লিখুন


5
এই উত্তরের আরও অনেকগুলি উর্ধ্বমুখী হওয়া উচিত। আমি সন্দেহ করি এটি কার্থেজ ব্যবহার করে বহু লোকের মূল কারণ।
mm2001

15
যদি আপনি একটি গতিশীল কাঠামো এম্বেড করার চেষ্টা করছেন তবে এটি সরিয়ে ফেললে আমার জন্য এই ত্রুটি বার্তায় ফলাফল আসে: "কারণ: চিত্রটি পাওয়া যায় নি"
electronix384128

1
এটি আমার পক্ষে কাজ করেছে। আপনাকে এম্বেডেড বাইনারিগুলি থেকে ফ্রেমওয়ার্কটি সরিয়ে ফেলতে হবে এবং কেবল এটি লিঙ্কযুক্ত ফ্রেমওয়ার্ক এবং লাইব্রেরিতে যুক্ত করতে হবে। এছাড়াও, আপনাকে অন্যান্য জিনিসগুলি করতে হবে যেমন আপনি অন্যান্য উত্তরগুলিতে সন্ধান করে স্ক্রিপ্টটি চালাচ্ছেন।
হাসিবুট

33

আপনি যদি ব্যবহার করছেন Carthageতবে নিশ্চিত হন যে আপনার Embed Frameworks Build Stepআগে রয়েছেCarthage copy-frameworks


কিছু অস্বাভাবিক ক্ষেত্রে (উদাহরণ: লটি-আইওএস ফ্রেমওয়ার্ক):

  • আপনার কাছে এটি যথারীতি "লিঙ্ক লাইব্রেরি" এ থাকবে।

  • তবে আপনাকে এটিকে "এম্বেড ফ্রেমওয়ার্কস" এও স্পষ্টভাবে যুক্ত করতে হবে (যদিও এটি অর্থহীন বলে মনে হয়, যেহেতু এটি কেবল "এম্বেড ফ্রেমওয়ার্কগুলিতে থাকে" তখন এটি পুরোপুরি কার্যকর হয়),

  • এবং এটি অনুলিপি ফ্রেমওয়ার্কে রাখুন

  • এবং কপি-ফ্রেমওয়ার্কগুলি "এম্বেড ফ্রেমওয়ার্কগুলি" পরে রয়েছে তা নিশ্চিত করুন


এইভাবে আমার সমস্যা। ধন্যবাদ.
ডুকিমন

15

নীচের পদক্ষেপটি ব্যবহার করে ফ্রেমওয়ার্ক থেকে [x86_64, i386] সরান । [x86_64, i386] সিমুলেটারের জন্য ব্যবহৃত হয়।

  1. খোলা Terminal

  2. আপনার প্রকল্পের টার্মিনালে সম্পর্কিত কাঠামোর টেনে আনুন open

    উদাহরণ: cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. নীচের কমান্ড এ আপনার ফ্রেমওয়ার্ক নাম সেট করুন এবং রান করুন

lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

  1. এখন আপনার প্রকল্পটি আবার খুলুন, পরিষ্কার, বিল্ড এবং রান করুন এবং সংরক্ষণাগার তৈরি করুন ...

@ মহিপাল সিংহ .. লিপো কমান্ড ব্যবহার করে অপসারণের পরে। অ্যাপ সিমুলেটারে কাজ করছে না। x84_64 আইফোন সিমুলেটারের জন্য অনুপস্থিত মত ত্রুটি পেয়েছে। কিন্তু বাস্তব ডিভাইসে সূক্ষ্মভাবে কাজ করছে।
হিতার্থ

এটি কারণ সিমুলেটর কেবল ডিবাগ কাঠামো সমর্থন করে
মৃপল সিং

14

আমি এখানে আমার 2 সেন্ট যুক্ত করব (কম ভীতিজনক পদ্ধতিতে :-)। আমি বিক্রেতাদের কাছ থেকে বেশ কয়েকটি ফ্যাট লাইব্রেরির মুখোমুখি হয়েছি যেগুলি (কোনও কারণে) Frameworksঅ্যাপল দ্বারা নথিভুক্ত ডিরেক্টরিতে তাদের যুক্ত করে স্বাভাবিক পদ্ধতিতে কাজ করে না । একমাত্র উপায় আমরা তাদের কাজ করতে সক্ষম হয়েছে টেনে হয় .framekworkপ্রকল্পের ডিরেক্টরির মধ্যে ডান এবং লিঙ্ক Embedded Frameworksএবং Link Binary with Librariesসেটিং Build এ ম্যানুয়ালি। এটি কোনও সমস্যা ছাড়াই কাজ করেছে বলে মনে হয়, তবে যে কোনও ফ্যাট লাইব্রেরির মতো তারা বহির্মুখী সিমুলেটর আর্কিটেকচার i386 এবং আর্কিটেকচারের x86_64সাথে আসে arm

ফ্যাট লাইব্রেরিতে আর্কিটেকচার চেক করার একটি দ্রুত উপায়

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

যা একটি আউটপুট এই জাতীয় কিছু spit উচিত

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

এটি নিশ্চিত করে যে আইটিউনস সংযোগ সংরক্ষণাগার আপলোড করার পূর্বে আপনার কাঠামো থেকে আপনাকে "ফ্যাটটি ছাঁটাতে হবে " (যেমন i386& x86_64) করতে হবে, যা এই আর্কিটেকচারগুলিকে অনুমতি দেয় না (যেহেতু তারা আইওএসের জন্য অসমর্থিত)।

এখন, এখানে সমস্ত উত্তর (বা কমপক্ষে কয়েকটি উত্তর) এই দুর্দান্ত রান স্ক্রিপ্টগুলি সরবরাহ করে যা আমি নিশ্চিত যে সত্যই ভাল কাজ করে তবে আপনার ফ্রেমওয়ার্কটি যদি Frameworksডিরেক্টরিতে থাকে the এখন আপনি যদি শেল স্ক্রিপ্ট জাঙ্কি না হন তবে পরিবর্তনগুলি ছাড়াই sc স্ক্রিপ্টগুলি উপরে বর্ণিত দৃশ্যের জন্য কাজ করবে না। তবে ফ্রেমওয়ার্ক থেকে i386& x86_64স্থাপত্যগুলি থেকে মুক্তি পাওয়ার জন্য খুব সহজ উপায় রয়েছে ।

  1. আপনার প্রকল্পের ডিরেক্টরিতে টার্মিনাল খুলুন।

  2. ডিরেক্টরিতে সরাসরি পরিবর্তন করুন .framekworklike

    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। উপরের কমান্ডগুলি কেবল কার্যকরভাবে এক্সিকিউটেবলের নাম পরিবর্তন করে এবং তারপরে অবশেষে পছন্দসই খিলানগুলি সরিয়ে, এবং তারপরে ফাইলগুলি বামে পরিষ্কার করে। এবং এটি হ'ল, আপনার এখন আইটিউনস কানেক্টে অ্যাপ্লিকেশন লোডার সংরক্ষণাগারটিতে একটি সবুজ চেক চিহ্ন দেখতে হবে mark

মনে রাখার বিষয়গুলি : উপরের পদক্ষেপগুলি কেবল তখনই নির্মাণের সময় করা উচিত, যেহেতু .frameworkসিমুলেটর আর্কিটেকচারগুলি বাদ দেওয়া হবে, সিমুলেটরগুলিতে বিল্ডিং কাজ করা বন্ধ করবে (যা প্রত্যাশিত)। বিকাশের পরিবেশে, .frameworkফাইলের বাইরে আর্কিটেকচারগুলি ছাঁটাই করার কোনও দরকার নেই যেহেতু আপনি সিমুলেটর এবং একটি শারীরিক ডিভাইস উভয়ই পরীক্ষা করতে সক্ষম হতে চান। যদি আপনার ফ্যাট লাইব্রেরি Frameworksপ্রকল্পের ফোল্ডারে থাকে তবে দয়া করে গৃহীত উত্তরটি দেখুন।


স্ক্রিপ্টিং মনে হয় না তাদের জন্য সহজ সমাধান।

ঠিক উপরের কমান্ডটি চালান, খিলানের আকারটি অর্ধেক হয়ে গেছে। আশা করি কিছু পার্থক্য করুন
শোম্যরোয়েটস

যদিও আমি সবকিছু স্বাভাবিক হিসাবে কাজ করতে স্ক্রিপ্টটি মোতায়েন করেছি তবে কীভাবে সমস্যাটি সমাধান করবেন সে সম্পর্কে এটি একটি সঠিক বর্ণনা হতে হবে।
মনকেকে

এই উত্তর প্রকৃতি পছন্দ। পরিষ্কার এবং সংক্ষিপ্ত
হুদি Ilfeld

10

স্ক্রিপ্ট যুক্ত করার পরে এবং ফ্রেমওয়ার্কটি কয়েকবার আপডেট করার পরেও আমার একই সমস্যা ছিল।

নিশ্চিত করুন যে এক্সকোডে স্ক্রিপ্টটি এম্বেডের পরে শেষে যুক্ত হয়েছে। আমি মনে করি এম্বেড থাকা কাঠামোর আগে দুর্ঘটনাক্রমে স্ক্রিপ্টটি স্থানান্তরিত করেছি।

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: আমার এক্সকোড 9.1 রয়েছে


এটি আমার পক্ষে কাজ করেছে। যেখানে কেবল @ pAkY88 এর স্ক্রিপ্টটি যথেষ্ট ছিল গতবারের মতো আমি প্রায় এক বছর আগে মুক্তি পেয়েছিলাম।
রেডহটপাউন ডটকম

আমার একই সমস্যা ছিল এবং এটি আমার পক্ষে কাজ করেছিল। প্রতিবার কোনও ফ্রেমওয়ার্ক সরানো এবং যুক্ত করা হলে রান স্ক্রিপ্টের অবস্থানটি পরীক্ষা করার বিষয়টি নিশ্চিত করুন (কেবলমাত্র যখন কেবলমাত্র একটি ফ্রেমওয়ার্ক সরানো হয়েছিল তখনই প্রয়োজন)।
বারাণ এমরে

তুমি আমার দিন বাঁচাও এমবেডড ফ্রেমওয়ার্কের পরে কেবল স্ক্রিপ্ট যুক্ত করতে।
ময়ূরী আর তালাভিয়া

8

এক্সকোড 10.1-র জন্য আপডেট হয়েছে, নীচের সমাধানটি আমার পক্ষে কাজ করেছে:

কেবল আপনাকে এম্বেডড বাইনারিগুলি থেকে ফ্রেমওয়ার্কটি সরিয়ে ফেলতে হবে এবং কেবল এটি লিঙ্কযুক্ত ফ্রেমওয়ার্ক এবং লাইব্রেরিতে যুক্ত করতে হবে।

স্ক্রিনশটের নীচে পড়ুন;

এখানে চিত্র বর্ণনা লিখুন


1
আমার (y) এর জন্য কার্যক্ষম সমাধান
অলোক

এটি লিঙ্কযুক্ত ফ্রেমওয়ার্ক এবং লাইব্রেরিগুলি থেকে
একইটি

8

উপরের সমস্ত উত্তর ধন্যবাদ। এখানে একটি স্ক্রিপ্ট দ্রুত 4.2 এবং 5 এর সাথে কাজ করছে । আপনার ফ্রেমওয়ার্কের মূল নামের সাথে আপনার_ফ্রেমওয়ার্ক_নাম স্ট্রিংটি প্রতিস্থাপন করুন।

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 অপসারণ করেছি।

এখানে চিত্র বর্ণনা লিখুন

এখন কেবল সমস্যাটি হ'ল আপনি সিমুলেটর পরীক্ষার উদ্দেশ্যে রিলিজ বিল্ডটি চালাতে পারবেন না । আপনি যত সহজেই খিলানগুলি সরিয়েছেন, আপনি চাইলে এগুলি আবার যুক্ত করতে পারেন।


1
হ্যাঁ, সমাধান।
অফির মালাচি

3

আমার পক্ষে কাজ করা সহজ সমাধান ছিল

1- এম্বেডড ফ্রেমওয়ার্কগুলি থেকে ফ্রেমওয়ার্কটি সরিয়ে ফেলুন।

2- একটি লিঙ্কযুক্ত কাঠামো হিসাবে কাঠামো যুক্ত করুন

সম্পন্ন!


1

এই ত্রুটি (ITMS-90240) স্ট্যাটিক (.a) লাইব্রেরির কারণেও হতে পারে। অতিরিক্ত আর্কিটেকচার কেটে ফেলার জন্য এখানে স্ক্রিপ্ট রয়েছে। এক্সকোডে এটিকে টার্গেট> বিল্ডপেজ> এ যোগ করুন> ক্লিক করুন এবং রান স্ক্রিপ্টটি নির্বাচন করুন। তারপরে স্ক্রিপ্ট বাক্সে এটি পেস্ট করুন।

স্ক্রিপ্টটি .a ফাইলগুলি অনুসন্ধান করে, এতে কোনও আপত্তিজনক আর্কিটেকচার রয়েছে কিনা তা পরীক্ষা করে দেখুন, যদি এটি আর্কিটেকচার ছাড়াই কোনও নতুন .a ফাইল তৈরি করে।

ম্যাকোসের জন্য:

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

আইওএসের জন্য:

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

আমার একই সমস্যা ছিল। এমনকি প্রদত্ত রান স্ক্রিপ্ট যুক্ত করার পরেও এটি কাজ করছে না। এটি ছিল এক্সকোড সম্পর্কিত সমস্যা। আমি এক্সকোড সংস্করণ 9.0 ব্যবহার করছিলাম তবে সর্বশেষ সংস্করণটি 9.2 ছিল।

সুতরাং আমি সর্বশেষতম Xcode (9.2) ইনস্টল করেছি এবং এটি কার্যকর।


0

আপনার কাঠামোর মধ্যে উভয় ARMএবং x86কোড রয়েছে , যা আপনাকে এটি কোনও ডিভাইসে বা সিমুলেটারে ব্যবহার করতে দেয়। আপনি যদি অ্যাপ্লিকেশন স্টোরটিতে আপনার অ্যাপ্লিকেশনটি জমা দিতে চান তবে বাইনারি থেকে নিষ্ক্রিয় কোডটি সরাতে নিম্নলিখিত স্ক্রিপ্টটি চালান।

1. প্রকল্প নেভিগেটরে আপনার টার্গেটটি নির্বাচন করুন এবং প্রকল্প সম্পাদকের শীর্ষে অবস্থিত বিল্ড পর্যায়গুলি ক্লিক করুন।

২.এডিটর মেনু থেকে, বিল্ড ফেজ যোগ করুন নির্বাচন করুন, তারপরে রান স্ক্রিপ্ট বিল্ড ফেজ যুক্ত করুন (বা বিল্ড ফেজস সম্পাদকের উপরের-বাম কোণে + বোতামটি ক্লিক করুন)।

৩. সদ্য যুক্ত হওয়া নতুন রান স্ক্রিপ্ট বিল্ড ফেজের পাশে প্রকাশ ত্রিভুজটি প্রসারিত করুন। স্ক্রিপ্ট সম্পাদক বাক্সে, নিম্নলিখিতটি পেস্ট করুন: বাশ

{U BUILT_PRODUCTS_DIR} / $ { ফ্রেমওয়ার্কএস_ফোল্ডার_পথ } / "আপনার ফ্রেমওয়ার্ক নেম.ফ্রেমওয়ার্ক" / স্ট্রিপ- ফ্রেমওয়ার্কস.এসএস


এটি ধরে নিয়েছে যে স্ট্রিপ-ফ্রেমওয়ার্কস.শ স্ক্রিপ্টটি সেখানে ঘটে ...
কোডজি

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"

আপনার প্রকল্পের টার্গেটের "প্রকল্পগুলি তৈরি করুন" প্রকল্পগুলিতে এই স্ক্রিপ্টটি যুক্ত করুন। বক্সটি চেক করতে ভুলবেন না: "ইনস্টল করার সময় কেবল স্ক্রিপ্ট চালান"

নমুনা স্ক্রিপ্টটি কোথায় sertোকাতে হবে তার পূর্বরূপ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.