Failed to verify bitcode while exporting archive for ad hoc distribution - tried Xcode 8.3.3 & Xcode 9

Vipin picture Vipin · Sep 25, 2017 · Viewed 19.3k times · Source

Apps containing our framework complains about missing bitcode while exporting archive for Ad-hoc distribution.

I have gone through the documentation provided by Apple in this regard Technical Note TN2432. The documentations' listed possible root causes do not resemble our scenario. (We are not using assembly instructions or have malformed info.plist file)

I have gone through following similar questions posted on SO

Error while exporting with Bitcode enabled (symbol not found for architecture armv7)

Is it possible to create a universal iOS framework using bitcode?

New warnings in iOS 9

But the provided solutions do not seem to work.

I have tried adding BITCODE_GENERATION_MODE flag in User-Defined build settings. I also tried adding -fembed-bitcode-marker & -fembed-bitcode in Other C flags in framework target.

I check if bitcode segments are present in my generated framework using the suggested command

otool -l -arch arm64 <framework_name> | grep __LLVM

It shows 2 segments

segname __LLVM

segname __LLVM

But while exporting the archive, Xcode still complains about absent bitcode.

I tried to upload app on App store to verify if this issue is due to Xcode versions (I tried 8.3.3. and 9.0), but I get following email about build import error from iTunes Store.

While processing your iOS app, APP_NAME 1.0(4), errors occurred in the app thinning process, and your app couldn’t be thinned. If your app contains bitcode, bitcode processing may have failed. Because of these errors, this build of your app will not be able to be submitted for review or placed on the App Store. For information that may help resolve this issue, see Tech Note 2432.

PS: Disabling bitcode is not an option for us as host app need to support bitcode.

Error while exporting the Archieve

Answer

Vipin picture Vipin · Oct 12, 2017

The error description took me in the wrong direction to find the solution.

This error is not related to bitcode. It appeared when the framework contained simulator slices (i386 x86_64)

Removing them before archiving resolved the issue.

Adding a run script phase to build phases of the target with following code helped in getting rid of the error.

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

Credits: http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/

If you don't know how to add a run script phase to your Xcode project, because maybe you're building a project with Cordova or Ionic and you never were taught much about Xcode, here's how you do that:

  • Open your project in Xcode.
  • Make sure you're looking at your project in the "Project Navigator" by clicking on the left-most icon in the left pane of Xcode (the one that says "show Project Navigator" when you point at it.
  • Click on your project at the top of the navigator window, so that it is selected as your target
  • At that point, in the middle portion of the Xcode window, you'll see several things appear near the top. General, Capabilities, Resource Tags, Info, among others. One of them is Build Phases -- click on it.
  • Click the + that's near the top-left of the middle portion of the Xcode Window. It will say Add New Build Phase if you point at it long enough.
  • Select "New Run Script Phase" from the menu that popped up when you clicked on the +
  • Click on the arrow next to the Run Script that just appeared.
  • Copy and paste the above script into the appropriate area just below the word "Shell". You shouldn't have to change anything else.
  • Build/Archive your project like normal, only now you won't get those annoying "failed to verify bitcode" errors. :-)