به نام خدا

وقتی یه اپ یواش یواش زمان انتشارش توی اپ استور میرسه یا اینکه مدیرپروژه یا مشتری میخواد اپ رو توی گوشی های مختلف تست کنه شما مجبور میشید که ساین برنامه رو تنظیم کنید و از توی ایکس کد وارد اکانت دولووپر اپل بشید تا یه Certificate برای برنامه ساخته بشه

گاهی توی بعضی از پروژه ها پیش میاد که یه فریمورکی که شما در حال استفاده از اون هستید (مثل درگاه پرداخت بانک پارسیان) زمان خروجی گرفتن و ارسال به اپ استور دردسر ساز میشه و اروری که بهتون میده اینه 

Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]

حالا این دو معماری چه اشکالی دارند که باید از پروژه حذف بشند؟ این دو معماری تنها و تنها برای شبیه ساز ها استفاده میشه یعنی اگر اون لایبراری از این دو معماری استفاده نکنه شما نمیتونید برنامه خودتون رو روی شبیه ساز اجرا کنید پس این به نفع خود شماست که سازنده اون فریمورک، این معماری ها رو توی پروژه اش گذاشته باشه

اپل از اینکه شما معماری هایی که فقط برای شبیه ساز ها استفاده میشن رو روی پروژه نهایی قرار بدید نارحت میشه یعنی اصلا اجازه انتشار نمیده یعنی اصلا نمیتونید آپلود کنید پس بهتره این آموزش رو تا آخر بخونید

راه حل:

دارای دو مرحله است:

۱. کپی کدها در RunScript

وارد قسمت Target -> Build Phases بشید و Run Script رو پیدا کنید

و کد زیر رو توش اجرا کنید

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

 

و حتما Shell رو هم برابر خط زیر قرار بدید:

/bin/sh

کد بالا هنگام بیلد کردن، اون دو معماری رو حذف میکنه اما مشکل اینه که اگه بخواید روی گوشی شبیه ساز نصب کنید مشکل ایجاد میشه (پس یادتون باشه این کدها رو بعد از آپلود روی اپ استور حذف کنید)

۲. حذف معماری های شبیه ساز از روی فریمورک:

قبل از انجام این مرحله اول اون فریمورک رو یه جا کپی کنید و از اونجا کار های زیر رو روش انجام بدید

حالا وارد اون فولدری که توش framework رو کپی کردید بشید و ترمینال رو باز کنید

با دستور cd دقیقا وارد فریمورک بشید یعنی اگر اسم فریمورک شما abc.framework  هست حتما دستور (cd abc.framework) رو بزنید تا ترمینال رو ببرید توی فریمورک 

و حالا با دستور lipo باید دو معماری i386 و x86_64 رو از فریمورک خودتون حذف کنید

lipo -remove i386 ProjectFramework_SDK -o ProjectFramework_SDK 
lipo -remove x86_64 ProjectFramework_SDK -o ProjectFramework_SDK

*  ProjectFramework_SDK رو اسم فریمورک بزارید یعنی دقیقا همون اسمی که هست (اگر مثلا Alamofire هست باید دقیقا همینو بنویسید Alamofire بدون هیچ کلمه کمتر یا بیشتر یا پسوند اضافه)

حالا برای اینکه بتونید ببینید توی فریمورک چند تا معماری و چه معماری هایی وجود داره از دستور زیر استفاده کنید

(دقت کنید اگه میخواید درست جواب بگیرید حتما با دستور cd دقیقا وارد .framework شده باشید)

lipo -info  FrameWorkName

 

نکته بسیار مهم:

هرموقع خواستید اپ رو روی اپ استور آپلود کنید این فریمورکی که ازش دومعماری رو حذف کردید جایگزین کنید و همچنین اون کد ها رو توی Run Script بریزید و آپلود کنید و حتما یادتون باشه اگه بعد از آپلود خواستید روی امولاتور تست کنید باید هم این فریمورک رو به حالت قبل برگردونید و هم اون کد رو از توی runscript پاک کنید و بعد روی امولاتور اجرا کنید.

موفق باشید 

یاعلی