Cli: PlistBuddy getting wrong CFBundleIdentifier variable with Xcode 12.0

Created on 1 Aug 2020  路  7Comments  路  Source: react-native-community/cli

/usr/libexec/PlistBuddy can not found a CFBundleIdentifier variable on Xcode 12 in iPhone 11 (iOS 14.0)

Description

I tried to run my paz.church application with theyarn ios that opens the iPhone 11 (iOS 14.0) XCode 12.0 simulator, but I get an error that cannot find the application in the build folder

React Native version:

System:
    OS: macOS 11.0
    CPU: (4) x64 Intel(R) Core(TM) i5-6360U CPU @ 2.00GHz
    Memory: 21.41 MB / 8.00 GB
    Shell: 5.8 - /bin/zsh
  Binaries:
    Node: 10.16.3 - ~/.nvm/versions/node/v10.16.3/bin/node
    Yarn: 1.22.4 - /usr/local/bin/yarn
    npm: 6.9.0 - ~/.nvm/versions/node/v10.16.3/bin/npm
    Watchman: Not Found
  Managers:
    CocoaPods: 1.9.3 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 14.0, DriverKit 20.0, macOS 11.0, tvOS 14.0, watchOS 7.0
    Android SDK:
      API Levels: 27, 28, 29
      Build Tools: 28.0.3, 29.0.2, 30.0.1
      System Images: android-29 | Google Play Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 4.0 4.0
    Xcode: 12.0/12A8169g - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_231 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: Not Found
    react: 16.11.0 => 16.11.0
    react-native: 0.62.2 => 0.62.2
  npmGlobalPackages:
    *react-native*: Not Found

Steps To Reproduce

Provide a detailed list of steps that reproduce the issue.

  1. yarn ios
PRODUCT_BUNDLE_IDENTIFIER = paz.church;
PRODUCT_NAME = Paz.Church;

Expected Results

Run on the ios 14.0 simulator (iPhone 11)

Snack, code example, screenshot, or link to a repository:

info Installing "/Users/emmet/Library/Developer/Xcode/DerivedData/pazchurch-dfffuyvjrmhokibjznhcqhpichmy/Build/Products/Debug-iphonesimulator/pazchurch.app"
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=2):
Failed to install the requested application
An application bundle was not found at the provided path.
Provide a valid path to the desired application bundle.
Print: Entry, ":CFBundleIdentifier", Does Not Exist
error Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier /Users/emmet/Library/Developer/Xcode/DerivedData/pazchurch-dfffuyvjrmhokibjznhcqhpichmy/Build/Products/Debug-iphonesimulator/pazchurch.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist
. Run CLI with --verbose flag for more details.
Error: Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier /Users/emmet/Library/Developer/Xcode/DerivedData/pazchurch-dfffuyvjrmhokibjznhcqhpichmy/Build/Products/Debug-iphonesimulator/pazchurch.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist

    at checkExecSyncError (child_process.js:629:11)
    at Object.execFileSync (child_process.js:647:13)
    at runOnSimulator (/Users/emmet/projects/github/pazchurch/node_modules/@react-native-community/cli-platform-ios/build/commands/runIOS/index.js:191:45)
    at process._tickCallback (internal/process/next_tick.js:68:7)
error Command failed with exit code 1.
bug report

Most helpful comment

@oeduardoal yeah, I saw that. Figured some more insight as to what caused it might be helpful to someone. If someone needs a quick in-place fix (i.e. in node_modules) because they were stuck on a locked version like me, two slashes before the equals sign in that line I listed does the trick.

All 7 comments

1208

It looks like xcode 12 is escaping the buildOutput. I've traced this to the following line in cli/packages/platform-ios/src/commands/runIOS/index.ts (in getProductName())

const productNameMatch = /export FULL_PRODUCT_NAME="?(.+).app"?$/m.exec( buildOutput, );

The line in the buildOutput string looks like this:

export FULL_PRODUCT_NAME\=something.app

Since getProductName() fails, it fallsback to the schema, which makes it somethingapp.app... and later PlistBuddy is looking for somethingapp.app, but the file was actually built as something.app

Fix: regex to ignore a slash before the equals sign

Parece que o xcode 12 est谩 escapando do buildOutput. Rastreei isso at茅 a seguinte linha em cli / packages / platform-ios / src / command / runIOS / index.ts (em getProductName ())

const productNameMatch = /export FULL_PRODUCT_NAME="?(.+).app"?$/m.exec( buildOutput, );

A linha na string buildOutput se parece com isto:

export FULL_PRODUCT_NAME\=something.app

Como getProductName () falha, ele retorna ao esquema, o que o torna somethingapp.app ... e, posteriormente, PlistBuddy est谩 procurando por somethingapp.app, mas o arquivo foi, na verdade, constru铆do como something.app

Corre莽茫o: regex para ignorar uma barra antes do sinal de igual

Hey @wansco check out this fix https://github.com/react-native-community/cli/pull/1236

@oeduardoal yeah, I saw that. Figured some more insight as to what caused it might be helpful to someone. If someone needs a quick in-place fix (i.e. in node_modules) because they were stuck on a locked version like me, two slashes before the equals sign in that line I listed does the trick.

@wansco 's solution worked great for us. If you're looking for a way to get handle changes in your node_modules files, we use patch-package pretty successfuly for these types of one-line changes to node_modules files.

@oaosman84 For what its worth, this link gives a better solution to anyone who has an old RN project and tried updating to the latest RN over the months/years:
https://github.com/react-native-community/cli#updating-the-cli
Manually deleting the @react-native-community/cli-* lines from package-lock.json to get a newer cli was a "better" fix for me.

@wansco That only works if you are on react native ^0.62 which uses the v4 of the cli. I'm on 0.61 which uses version 3 of the cli.

Was this page helpful?
0 / 5 - 0 ratings