web-dev-qa-db-ja.com

アドホック配布用のアーカイブのエクスポート中にビットコードを検証できませんでした-Xcode 8.3.3およびXcode 9を試しました

フレームワークを含むアプリは、アドホック配布用のアーカイブをエクスポートする際にビットコードが欠落しているという苦情を訴えます。

Apple Technical Note TN2432 によって提供されるドキュメントを確認しました。ドキュメントに記載されている考えられる根本原因は、シナリオに似ていません。アセンブリ命令または不正な形式のinfo.plistファイルがあります)

私はSOに投稿された同様の質問を次のように経験しました

ビットコードを有効にしてエクスポート中にエラーが発生しました(アーキテクチャarmv7のシンボルが見つかりません)

ビットコードを使用してユニバーサルiOSフレームワークを作成することは可能ですか?

iOS 9の新しい警告

しかし、提供されているソリューションは機能していないようです。

ユーザー定義のビルド設定に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:ホストアプリはビットコードをサポートする必要があるため、ビットコードを無効にすることはオプションではありません。

Error while exporting the Archieve

21
Vipin

エラーの説明は、解決策を見つけるために間違った方向に連れて行ってくれました。

このエラーはビットコードとは関係ありません。フレームワークにシミュレータスライス(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について多くのことを学んだことがないため、あなたはそれをします:

  • Xcodeでプロジェクトを開きます。
  • Xcodeの左ペインの左端のアイコン(「Project Navigatorを表示する」を指すと表示されるアイコン)をクリックして、「Project Navigator」でプロジェクトを見ていることを確認します。
  • ナビゲータウィンドウの上部にあるプロジェクトをクリックして、ターゲットとして選択します
  • その時点で、Xcodeウィンドウの中央部分に、上部近くにいくつかのものが表示されます。全般、機能、リソースタグ、情報など。その1つがビルドフェーズです。クリックします。
  • Xcodeウィンドウの中央部分の左上にある+をクリックします。あなたがそれを十分に長く指せば、それはAdd New Build Phaseを言うでしょう。
  • [+]をクリックすると表示されるメニューから[新しいスクリプト実行フェーズ]を選択します
  • 表示されたRun Scriptの横にある矢印をクリックします。
  • 上記のスクリプトをコピーして、「シェル」という単語のすぐ下の適切な領域に貼り付けます。他に何も変更する必要はありません。
  • 通常のようにプロジェクトをビルド/アーカイブします。今では、これらの迷惑な「ビットコードの検証に失敗しました」というエラーは発生しません。 :-)
63
Vipin

ビルド設定でビットコードを有効にするを「いいえ」に設定する必要がありました

12
MobileMon

以下を試してください:

  • このフレームワークが、ビルドフェーズのフレームワークスクリプトのコピーの下に追加されていることを確認します。
  • BITCODE_GENERATION_CODEの代わりにBITCODE_GENERATION_MODEを使用します
1
Roy K