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.
Мое решение похоже:
- открыть файл./node_modules/react-native/local-cli/runIOS.js
изменить путь сборки из:
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