Engr.Aftab Ufaq
Engr.Aftab Ufaq

Reputation: 6344

Asset validation failed, NSLocalizedRecoverySuggestion=Invalid Executable. The executable hermes.framework/hermes' contains bitcode

if a build the app it is correct. archieve is also correct. but when i upload app to Test Flight i get this error o MacOS 15 , Xcode 16 .

<IDEDistributionContext: 0x7f9ef32a6d50; archive = "<IDEArchive: 0x6000171f4620>", distributionMethod="(null)", team="(null)">
    <IDEDistributionContext: 0x7f9ef30a67d0; archive = "<IDEArchive: 0x6000171f4620>", distributionMethod="(null)", team="(null)">
    <IDEDistributionContext: 0x7f9ef0aff8d0; archive = "<IDEArchive: 0x6000171f4620>", distributionMethod="(null)", team="(null)">
</IDEDistributionContext: 0x7f9ef0a1a0f0>
2024-09-25 10:05:15 +0000 [MT] Upload for archive TrueCaller had issues:
(
    "<IDEDistributionIssue: severity(error), error(Error Domain=ContentDelivery Code=90482 \"Asset validation failed\" UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription=Asset validation failed, NSLocalizedRecoverySuggestion=Invalid Executable. The executable 'TrueCaller.app/Frameworks/hermes.framework/hermes' contains bitcode. (ID: 70394fde-4ed8-40ca-b6a8-2aabb46b397a)})>"

Upvotes: 13

Views: 15351

Answers (3)

Avtar Singh
Avtar Singh

Reputation: 1094

I was getting the same issue after upgraded to Xcode 16 and iOS 18.

You can solve this issue by following this.

  1. Open Podfile

  2. Search for word post_install

  3. If post_install not found then just directly paste the below code just before the last end keyword

     post_install do |installer|
    
     bitcode_strip_path = `xcrun --find bitcode_strip`.chop!
       def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
         framework_path = File.join(Dir.pwd, framework_relative_path)
         command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
         puts "Stripping bitcode: #{command}"
         system(command)
       end
    
       framework_paths = [
         "Pods/LogRocket/LogRocket.xcframework/ios-arm64/LogRocket.framework/LogRocket",
         "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/Versions/Current/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64/hermes.framework/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64_x86_64-maccatalyst/hermes.framework/hermes"
       ]
    
       framework_paths.each do |framework_relative_path|
         strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
       end
    
  4. In case you have already post_install has been used then copy and past the below script inside that.

       bitcode_strip_path = `xcrun --find bitcode_strip`.chop!
       def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
         framework_path = File.join(Dir.pwd, framework_relative_path)
         command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
         puts "Stripping bitcode: #{command}"
         system(command)
       end
    
       framework_paths = [
         "Pods/LogRocket/LogRocket.xcframework/ios-arm64/LogRocket.framework/LogRocket",
         "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/Versions/Current/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64/hermes.framework/hermes",
         "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64_x86_64-maccatalyst/hermes.framework/hermes"
       ]
    
       framework_paths.each do |framework_relative_path|
         strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
       end
    
  5. Do pod install

  6. Do archive again and try upload

Upvotes: 54

Smarty
Smarty

Reputation: 773

if you are using RN version below 0.72 you might face error like this change your podfile to this below is the full code of podfile ignore comments

require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'

platform :ios, '13.0'
install! 'cocoapods', :deterministic_uuids => false

target 'myApp' do
  config = use_native_modules!

  # Flags change depending on the env values.
  flags = get_default_flags()

  use_react_native!(
    :path => config[:reactNativePath],
    # to enable hermes on iOS, change `false` to `true` and then install pods
    :hermes_enabled => flags[:hermes_enabled],
    :fabric_enabled => flags[:fabric_enabled],
    # An absolute path to your application root.
    :app_path => "#{Pod::Config.instance.installation_root}/.."
  )
  
  pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons'
  pod 'RNCPicker', :path => '../node_modules/@react-native-picker/picker'
  pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'

  target 'myAppTests' do
    inherit! :complete
    # Pods for testing
  end

  # Enables Flipper.
  #
  # Note that if you have use_frameworks! enabled, Flipper will not work and
  # you should disable the next line.
  use_flipper!()

  post_install do |installer|
    react_native_post_install(installer)
    __apply_Xcode_12_5_M1_post_install_workaround(installer)

    bitcode_strip_path = `xcrun --find bitcode_strip`.chomp
    unless bitcode_strip_path.empty?
      def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
        framework_path = File.join(Dir.pwd, framework_relative_path)
        if File.exist?(framework_path)
          command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
          puts "Stripping bitcode: #{command}"
          system(command)
        else
          puts "Framework not found at path: #{framework_path}, skipping bitcode strip."
        end
      end

      framework_paths = [
        "Pods/LogRocket/LogRocket.xcframework/ios-arm64/LogRocket.framework/LogRocket",
        "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/hermes",
        "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/Versions/Current/hermes",
        "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64/hermes.framework/hermes",
        "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64_x86_64-maccatalyst/hermes.framework/hermes"
      ]

      framework_paths.each do |framework_relative_path|
        strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
      end
    else
      puts "bitcode_strip tool not found, skipping bitcode stripping."
    end
  end
end

now run

pod install

Upvotes: 2

Engr.Aftab Ufaq
Engr.Aftab Ufaq

Reputation: 6344

create a file in the ios folder with name `

handle_bitcode.sh`

use this commnad

touch handle_bitcode.sh

and then run this command

sudo chmod +x handle_bitcode.sh

and paste this script

#!/bin/bash

# Function to check if a binary contains bitcode
check_bitcode() {
  local binary_path=$1
  if otool -l "$binary_path" | grep -q __LLVM; then
    echo "$binary_path contains bitcode."
    echo "$binary_path" >> bitcode_frameworks.txt
  else
    echo "$binary_path does not contain bitcode."
  fi
}

# Function to strip bitcode from a binary
strip_bitcode() {
  local binary_path=$1
  local output_path="${binary_path}_stripped"
  xcrun bitcode_strip "$binary_path" -r -o "$output_path"
  echo "Stripped bitcode from $binary_path and saved to $output_path"
}

# Function to replace original binary with the stripped version
replace_framework() {
  local original_path=$1
  local stripped_path="${original_path}_stripped"

  if [ -f "$stripped_path" ]; then
    echo "Replacing $original_path with $stripped_path..."
    rm "$original_path"
    mv "$stripped_path" "$original_path"
    echo "Replaced $original_path successfully."
  else
    echo "Stripped binary $stripped_path not found. Skipping."
  fi
}

# Function to disable Bitcode in the Xcode project
disable_bitcode_in_project() {
  # Automatically detect the Xcode project file
  local xcodeproj_file=$(find . -name "*.xcodeproj" | head -n 1)
  if [ -z "$xcodeproj_file" ]; then
    echo "Xcode project not found. Exiting."
    exit 1
  fi
  local xcodeproj_name=$(basename "$xcodeproj_file" .xcodeproj)

  echo "Disabling Bitcode in Xcode project $xcodeproj_name..."
  /usr/libexec/PlistBuddy -c "Set :buildSettings:ENABLE_BITCODE NO" "$xcodeproj_file/project.pbxproj"

  # Clean and rebuild the Xcode project
  echo "Cleaning the build folder..."
  xcodebuild clean -workspace "$xcodeproj_name.xcworkspace" -scheme "$xcodeproj_name" -configuration Debug

  echo "Building the project..."
  xcodebuild -workspace "$xcodeproj_name.xcworkspace" -scheme "$xcodeproj_name" -configuration Debug

  echo "Process completed successfully!"
}

# Step 1: Check frameworks for Bitcode
echo "Checking frameworks for Bitcode..."

# Remove old bitcode_frameworks.txt if it exists
rm -f bitcode_frameworks.txt

# Check frameworks in Pods and the ios directory
if [ -d "Pods" ]; then
  echo "Checking frameworks in Pods..."
  find Pods -name '*.framework' -type d | while read -r framework; do
    binary_name=$(basename "$framework" .framework)
    binary_path="$framework/$binary_name"
    if [ -f "$binary_path" ]; then
      check_bitcode "$binary_path"
    fi
  done
fi

echo "Checking frameworks in the ios directory..."
find . -name '*.framework' -type d | while read -r framework; do
  binary_name=$(basename "$framework" .framework)
  binary_path="$framework/$binary_name"
  if [ -f "$binary_path" ]; then
    check_bitcode "$binary_path"
  fi
done

echo "Bitcode check completed. Frameworks containing bitcode are listed in bitcode_frameworks.txt."

# Step 2: Strip Bitcode from all frameworks that contain it
if [ -f bitcode_frameworks.txt ]; then
  echo "Stripping bitcode from frameworks..."
  while read -r binary_path; do
    strip_bitcode "$binary_path"
  done < bitcode_frameworks.txt
else
  echo "No frameworks found containing bitcode. Exiting."
  exit 1
fi

# Step 3: Replace original frameworks with stripped versions
echo "Replacing original frameworks with stripped versions..."
while read -r binary_path; do
  replace_framework "$binary_path"
done < bitcode_frameworks.txt

# Step 4: Disable Bitcode in the Xcode project and rebuild
disable_bitcode_in_project

in the termianl run this in ios folder

./handle_bitcode.sh

Upvotes: 13

Related Questions