Search code examples
iosxcodereact-nativehermes

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)})>"

Solution

  • 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