Help us understand the problem. What is going on with this article?

リリースビルドからSimulator用のarchitectureを抜く方法(Unity編)

More than 1 year has passed since last update.

背景

iOSアプリ向けのSDK(framework)には、実機とシミュレータの両方で動作するよう、Simulator用のアーキテクチャが含まれている場合があります。そのようなSDKを組み込んだ状態でリリースビルドを作成し、iTunesConnectにアップロードをしようとすると、下記のように"Unsupported Architectures"のエラーが出てアップロードに失敗することがあります。

iTC-Unsupported-Archs.png

これを回避するには、XcodeのBuild Phases -> Run Scriptの項目に、Simulator用Architectureを除去するスクリプトを追加する必要があります。この手法については下記の記事が参考になります。
http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/
https://stackoverflow.com/questions/30547283/submit-to-app-store-issues-unsupported-architecture-x86

ただし、純粋なiOSアプリでなくUnityからXcodeにエクスポートしたプロジェクトの場合、上記のスクリプトを追加してもアップロードに失敗するケースがあります。その場合、下記で紹介するようにスクリプトに若干修正を加える必要があります。

UnityからXcodeにエクスポートした場合の除外スクリプト

※'YourLibrary.framework'の箇所を適切なframework名に修正してください

UnityからiOSへエクスポートした場合のスクリプト
#!/bin/sh

# SDK search path for project source directory
APP_PATH_SRC="${PROJECT_DIR}"

# SDK search path for build destination directory
APP_PATH_DST="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

echo "APP_PATH_SRC: $APP_PATH_SRC"
echo "APP_PATH_DST: $APP_PATH_DST"

# Search SDK from destination path first. If not found, search from source path.
find "$APP_PATH_DST" "$APP_PATH_SRC" -name 'YourLibrary.framework' -type d | while read -r FRAMEWORK
do
echo "FRAMEWORK: $FRAMEWORK"
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"

# If SDK was found in the first loop (destination path), no need to proceed to next loop.
break
done

処理内容

元記事のスクリプトでは\$APP_PATH_DSTのみに対し走査を行なっているのに対し、上記のスクリプトでは\$APP_PATH_SRCと\$APP_PATH_DSTという2つのディレクトリに対し走査を行ってarchitectureの除去を行っています。これは、Unityからエクスポートしたプロジェクトの場合、なぜか除去のタイミングのあとにビルドディレクトリへのframeworkのコピーが行われ、architectureの除去がうまくいかない場合があるためです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away