Skip to content

iOS build fails with "Could not find target" for app names with accented characters on SDK 58 (bundled @expo/config-plugins sanitizes names differently) #4715

Open

Description

@murillopm

Build/Submit details page URL

https://expo.dev/accounts/alboom-apps/projects/fotto-app/builds/e8793bcf-6f62-4e36-9006-21648d9c5e9d

Summary

Since SDK 58, iOS builds of managed projects whose name contains accented characters fail in the "Configure Xcode project" step:

Assigning provisioning profile '*[expo] com.fotto.fotografos AppStore ...' to target 'FottoFotgrafos'
Could not find target 'FottoFotgrafos' in project.pbxproj

The app name is Fotto Fotógrafos. Two different versions of IOSConfig.XcodeUtils.sanitizedName produce two different target names:

Where @expo/config-plugins sanitizedName('Fotto Fotógrafos')
expo prebuild (project, SDK 58) 58.0.9 FottoFotografos
eas-cli 25.3.0 (bundled) 55.0.7 FottoFotgrafos

expo/expo#49143 changed the sanitizer to NFKD-normalize before stripping, so ó now becomes o instead of being dropped. That change shipped in @expo/config-plugins 58.0.x, but eas-cli still bundles 55.0.7. So eas-cli resolves the target name with the old algorithm (for example in build/project/ios/scheme.js and the targetName === sanitizedName(exp.name) assertion in bundleIdentifier.js), while the generated Xcode project uses the new one.

#4395 would bump the bundled stack to 56.0.16, which still has the old sanitizer, so it wouldn't fix this.

Any name whose old and new sanitized forms differ is affected (for example Skráning, Árbók, Bjørn, Straße). ASCII-only names are not affected.

Managed or bare?

Managed (CNG, ios/ is gitignored and generated by prebuild on EAS)

Environment

  • eas-cli 25.3.0 (latest at time of writing), bundles @expo/config-plugins 55.0.7
  • expo 58.0.16, @expo/config-plugins 58.0.9
  • Build triggered via EAS Workflows, production profile
  • Project also has an iOS widget extension target (expo-widgets), which is resolved correctly

Error output

Configuring Xcode project
Assigning provisioning profile '[expo] com.fotto.fotografos.ExpoWidgetsTarget AppStore 2026-07-23T19:44:32.192Z' (Apple Team ID: 4GYFGE5BQ8) to target 'ExpoWidgetsTarget'
Assigning provisioning profile '
[expo] com.fotto.fotografos AppStore 2026-06-09T02:01:20.196Z' (Apple Team ID: 4GYFGE5BQ8) to target 'FottoFotgrafos'
Could not find target 'FottoFotgrafos' in project.pbxproj

Reproducible demo or steps to reproduce from a blank project

  1. npx create-expo-app@latest repro (SDK 58)
  2. Set "name": "Fotto Fotógrafos" (or any name with an accented letter) and an iOS bundleIdentifier in app.json
  3. eas build -p ios --profile production
  4. The build fails in "Configure Xcode project" with Could not find target 'FottoFotgrafos'

The mismatch can be confirmed without a build:

const oldS = require('<global eas-cli>/node_modules/@expo/config-plugins').IOSConfig.XcodeUtils.sanitizedName
const newS = require('@expo/config-plugins').IOSConfig.XcodeUtils.sanitizedName
oldS('Fotto Fotógrafos') // 'FottoFotgrafos'
newS('Fotto Fotógrafos') // 'FottoFotografos'

Workaround: use an ASCII name (for example Fotto Fotografos), so both algorithms agree, and restore the accented display name with a config plugin that sets CFBundleDisplayName (iOS) and app_name in strings.xml (Android).

Suggested fix: bump the bundled @expo/config-plugins to a version that includes expo/expo#49143. Alternatively, resolve the target name from the generated project.pbxproj / the project's own @expo/config-plugins instead of recomputing it from exp.name.

Activity

  1. mrkpatchaa commented on Oct 23, 2026

    @mrkpatchaa

    Same failure here, with the app name Assigamé:

    Could not find target 'Assigam' in project.pbxproj
    

    The SDK 58 prebuild created the target Assigame.

    • Build: 594e4024-6bf0-4c6d-b017-7f6558292d69 (managed, production profile, run from GitHub Actions)
    • eas-cli 25.3.0, which bundles @expo/config-plugins 55.0.7
    • expo 58.0.14, project @expo/config-plugins 58.0.9

    The workaround in the issue works for us: name: 'Assigame', with CFBundleDisplayName and Android app_name set to Assigamé. Note that it changes the fingerprint, so builds made before the change get no later OTA updates on the new runtime.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs reviewIssue is ready to be reviewed by a maintainer

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions