tauri-apps/tauri · error · tauri_cli::error::Error

Arch specified by Xcode was invalid. {arch} isn't a known ar

Error message

Arch specified by Xcode was invalid. {arch} isn't a known arch

What it means

The Xcode script helper maps each architecture Xcode asks it to build (from ARCHS) onto a Rust target triple: arm64 on device -> aarch64-apple-ios, arm64 on simulator -> aarch64-apple-ios-sim, x86_64 -> x86_64-apple-ios. Any other value in ARCHS falls through to this bail, meaning Xcode requested an architecture Tauri cannot compile for.

Source

Thrown at crates/tauri-cli/src/mobile/ios/xcode_script.rs:225

    } else {
      "x86_64"
    }
    .to_string()]
  } else {
    options.arches
  };

  let installed_targets =
    crate::interface::rust::installation::installed_targets().unwrap_or_default();

  for arch in arches {
    // Set target-specific flags
    let (env_triple, rust_triple) = match arch.as_str() {
      "arm64" if !simulator => ("aarch64_apple_ios", "aarch64-apple-ios"),
      "arm64" if simulator => ("aarch64_apple_ios_sim", "aarch64-apple-ios-sim"),
      "x86_64" => ("x86_64_apple_ios", "x86_64-apple-ios"),
      _ => {
        crate::error::bail!("Arch specified by Xcode was invalid. {arch} isn't a known arch")
      }
    };

    let interface = AppInterface::new(&tauri_config, Some(rust_triple.into()), dirs.tauri)?;

    let cflags = format!("CFLAGS_{env_triple}");
    let cxxflags = format!("CFLAGS_{env_triple}");
    let objc_include_path = format!("OBJC_INCLUDE_PATH_{env_triple}");
    let mut target_env = host_env.clone();
    target_env.insert(cflags.as_ref(), isysroot.as_ref());
    target_env.insert(cxxflags.as_ref(), isysroot.as_ref());
    target_env.insert(objc_include_path.as_ref(), include_dir.as_ref());

    let target = if macos {
      &macos_target
    } else {
      Target::for_arch(if arch == "arm64" && simulator {
        "arm64-sim"

View on GitHub (pinned to 52e4b6e71d)

Solutions

  1. In the target's Build Settings set ARCHS to exactly `arm64` (device/simulator) and/or `x86_64` (Intel simulator); delete custom ARCHS entries so the default applies.
  2. Use EXCLUDED_ARCHS to remove unwanted arches (e.g. EXCLUDED_ARCHS[sdk=iphonesimulator*] = i386) instead of rewriting ARCHS.
  3. If a script forwards ARCHS to the tauri xcode-script phase, sanitize it to the supported set first.
  4. Verify with `xcodebuild -showBuildSettings -scheme <scheme> | grep ARCHS`.

Example fix

// before (Build Settings)
ARCHS = armv7 arm64
// error: Arch specified by Xcode was invalid. armv7 isn't a known arch

// after
ARCHS = arm64
EXCLUDED_ARCHS[sdk=iphonesimulator*] = i386
Defensive patterns

Strategy: validation

Validate before calling

# In a pre-build script, validate ARCHS forwarded to the tauri phase
for a in $ARCHS; do
  case "$a" in arm64|x86_64) ;; *) echo "unsupported ARCHS entry: $a"; exit 1;; esac
done

Prevention

When it happens

Trigger: The ARCHS build setting (or a value derived from it, e.g. in a Universal build or after filtering by EXCLUDED_ARCHS) contains something other than arm64/x86_64 — such as arm64e, armv7, arm64_32, i386, or a malformed value. Also occurs when building a watchOS-adjacent scheme against the iOS project.

Common situations: Manually setting ARCHS in Build Settings; third-party xcconfig files injecting extra architectures; Xcode's 'Standard Architectures' resolving unexpectedly on unusual SDKs; fat/universal build scripts that forward ARCHS verbatim.

Related errors


AI-assisted analysis of tauri-apps/tauri@52e4b6e71d (2026-08-20). Data as JSON: /api/errors/9c429869ff8e91a0. Report an issue: GitHub.