React Native: Идентификатор пакета не существует

У меня есть проект в React Native, который имеет две разные схемы сборки и использует cocoapods. Для компиляции я запускаю:

react-native run-ios --scheme="RNProject-(SCHEME_NAME)"

В результате приложения, например:

./build/Build/Products/Debug/iphonesimulator/RNProject-customer1.app
./build/Build/Products/Debug/iphonesimulator/RNProject-customer2.app
  • Используя команду, она строит для одной из схем сборки, но не для другой
  • Xcode всегда строит проект для обеих схем сборки
  • Более того, build/Build/Products/Debug-iphonesimulator/RNProject-customer1.app/Info.plist существует в этом пути, и файл содержит действительный CFBundleIdentifier (это соответствует General > Identity > Bundle Identifier для каждой из двух схем сборки)
  • Настройки проекта кажутся правильными для обеих схем (после проверки ios/RNProject.xcodeproj/project.pbxproj)
  • Настройки схемы находятся в ios/Pods/Target Support Files/Pods-RNProject-customer1 а также ios/Pods/Target Support Files/Pods-RNProject-customer2

Я пробовал разные способы решить это:

  • Бег sudo react-native
  • Перезапуск упаковщика RN
  • Редактирование вручную Info.plist
  • Изменение места сборки

Приставка:

** BUILD SUCCEEDED **

Installing build/Build/Products/Debug-iphonesimulator/RNProject.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
child_process.js:509
    throw err;
    ^

Error: Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier build/Build/Products/Debug-iphonesimulator/RNProject.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist

    at checkExecSyncError (child_process.js:486:13)
    at Object.execFileSync (child_process.js:506:13)
    at ChildProcess.xcodeBuildProcess.on.code (node_modules/react-native/local-cli/runIOS/runIOS.js:109:36)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:852:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:215:5)

2 ответа

Проблема была в том, как имена React Native помечают исполняемые файлы.

Мой проект XCode создал два исполняемых файла с разными именами на основе настроек проекта XCode.

React Native, с другой стороны, формирует исполняемое имя файла из .xcworkspace имя файла в этом скрипте (./node_modules/react-native/local-cli/runIOS/runIOS.js:57):

const inferredSchemeName = path.basename(xcodeProject.name, path.extname(xcodeProject.name));

Два подхода различны и приводят к двум различным именам исполняемых файлов (например, Xcode build/Build/Products/Debug-iphonesimulator/RNProject-customer1.app против React Native build/Build/Products/Debug-iphonesimulator/RNProject.app).

Я установил пользовательское значение для inferredSchemeNameсоответствовать имени файла, созданному XCode.

Мое решение похоже:

  1. открыть файл./node_modules/react-native/local-cli/runIOS.js
  2. изменить путь сборки из:

    const getBuildPath = function(configuration = 'Debug', appName, isDevice) {  
      return `build/Build/Products/${configuration}-${isDevice ? 'iphoneos' : 'iphonesimulator'}/${appName}.app`;
    };
    

в

    const getBuildPath = function(configuration = 'Debug', appName, isDevice) {  
      return `build/Build/Products/${configuration}-${isDevice ? 'iphoneos' : 'iphonesimulator'}/${appName}.app`;
    };
  • удалить "Build" в пути.

Я использую Xcode-beta 8.2

Другие вопросы по тегам