フレームワークを含むアプリは、アドホック配布用のアーカイブをエクスポートする際にビットコードが欠落しているという苦情を訴えます。
Apple Technical Note TN2432 によって提供されるドキュメントを確認しました。ドキュメントに記載されている考えられる根本原因は、シナリオに似ていません。アセンブリ命令または不正な形式のinfo.plistファイルがあります)
私はSOに投稿された同様の質問を次のように経験しました
ビットコードを有効にしてエクスポート中にエラーが発生しました(アーキテクチャarmv7のシンボルが見つかりません)
ビットコードを使用してユニバーサルiOSフレームワークを作成することは可能ですか?
しかし、提供されているソリューションは機能していないようです。
ユーザー定義のビルド設定にBITCODE_GENERATION_MODE
フラグを追加しようとしました。また、フレームワークターゲットの他のCフラグに-fembed-bitcode
- markerと-fembed-bitcode
を追加しようとしました。
suggested コマンドを使用して、生成されたフレームワークにビットコードセグメントが存在するかどうかを確認します
otool -l -Arch arm64 <framework_name> | grep __LLVM
2つのセグメントを示しています
segname __LLVM
segname __LLVM
ただし、アーカイブをエクスポートしている間、Xcodeはビットコードがないことに不満を抱いています。
App Storeにアプリをアップロードして、この問題がXcodeバージョンによるものかどうかを確認しようとしました(8.3.3および9.0を試しました)が、iTunes Storeからビルドインポートエラーに関する次のメールを受け取ります。
IOSアプリAPP_NAME 1.0(4)の処理中に、アプリの間引きプロセスでエラーが発生し、アプリを間引くことができませんでした。アプリにビットコードが含まれている場合、ビットコード処理が失敗した可能性があります。これらのエラーのため、アプリのこのビルドをレビュー用に送信したり、App Storeに置いたりすることはできません。この問題の解決に役立つ情報については、テクニカルノート2432を参照してください。
PS:ホストアプリはビットコードをサポートする必要があるため、ビットコードを無効にすることはオプションではありません。
エラーの説明は、解決策を見つけるために間違った方向に連れて行ってくれました。
このエラーはビットコードとは関係ありません。フレームワークにシミュレータスライス(i386 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
クレジット: http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/
実行スクリプトフェーズをXcodeプロジェクトに追加する方法がわからない場合、おそらくCordovaまたはIonicでプロジェクトを構築していて、Xcodeについて多くのことを学んだことがないため、あなたはそれをします:
ビルド設定でビットコードを有効にするを「いいえ」に設定する必要がありました
以下を試してください: