反应原生上不存在CFBundleIdentifier
在这里可以轻松获得赏金。不一定需要任何 react-native 经验。问题似乎出在开源代码中,可以在那里获得:
更新了 xcode,现在当我尝试通过发出以下命令来运行我的 react-native 应用程序时:react-native run-ios我收到一个错误:
处理命令时遇到错误(域=NSPOSIXErrorDomain,代码=2):无法安装请求的应用程序 在提供的路径中找不到应用程序包。提供所需应用程序包的有效路径。打印:条目,“:CFBundleIdentifier”,不存在错误命令失败:/usr/libexec/PlistBuddy -c 打印:CFBundleIdentifier DerivedData/Build/Products/Debug-iphonesimulator/MyAppName.app/Info.plist 打印:条目,“: CFBundleIdentifier", 不存在
调试错误:命令失败:/usr/libexec/PlistBuddy -c 打印:CFBundleIdentifier DerivedData/Build/Products/Debug-iphonesimulator/MyAppName.app/Info.plist 打印:条目,“:CFBundleIdentifier”,不存在于 checkExecSyncError (child_process .js:616:11) at Object.execFileSync (child_process.js:634:13) at runOnSimulator (project-root-dir/node_modules/@react-native-community/cli/build/commands/runIOS/runIOS.js: 181:45)
在出现这些错误之前,该命令会打印出有关成功构建的信息,以及即将安装构建的信息:
信息 ** 构建成功 **
info 安装 DerivedData/Build/Products/Debug-iphonesimulator/MyAppName.app
所以看起来构建没问题,但是当它尝试安装应用程序时失败了?
认为我已经尝试了从其他问题中发现的“所有内容”,并带有类似的错误消息,但没有任何效果。
一些规格:
反应原生:0.59.10
反应:16.8.3
xcode 版本:版本 12.2 (12B45b)
我知道在 stackoverflow 上也有类似的问题。但是由于那里提供的解决方案都没有对我有用,而且我希望解决它,所以我提出了这个单独的问题。
我不知道它试图找到的 Info.plist 文件在哪里:DerivedData/Build/Products/Debug-iphonesimulator/MyAppName.app/Info.plist
在我的 ios 文件夹中,有一个名为 DerivedData 的文件夹,但里面没有名为Build 的文件夹。所以我认为它可能是从错误的位置看的?
更新:
我已经能够查明 cli 启动出错的地方:https :
//github.com/react-native-community/cli/blob/ba298d9c47af522f0377325bebc6c2075d41790a/packages/platform-ios/src/commands/runIOS/index.ts# L378
如果我改变那条线 let buildPath = build/${scheme}/Build/Products/${configuration}-${device}/${appName}.app
到 -> build/${scheme}/Build/Products/${configuration}-${device}/MyAppRealName.app;
然后开发启动运行良好,没有问题。所以看起来获取 appName 出错了。appName 在这里解析:https : //github.com/react-native-community/cli/blob/ba298d9c47af522f0377325bebc6c2075d41790a/packages/platform-ios/src/commands/runIOS/index.ts#L387
const productNameMatch = /export FULL_PRODUCT_NAME="?(.+).app"?$/m.exec(buildOutput);
我可以做一个安装后 npm 脚本,它只是将应用程序的名称设置为正确的,然后就可以了。但这是非常hacky的方式。我想知道是否有更好的替代方案?我看到 runIOS 文件已经从我拥有的版本更新了很多,但是函数 getProductName 仍然保持不变。所以我不确定只更新 cli 是否可行,或者是否可行,因为它可能需要更新的 react-native 版本,这对我来说现在不是一个选择。
回答
的较新版本@react-native-community/cli不适用于较旧版本的 react-native,因为在较新版本中它们已更改getProductName为getPlatformName. 有关更多详细信息,您可以阅读此PR 的摘要
解决方案
作为本地解决方法,通过patch-package 修补包 node_modules/@react-native-community/cli-platform-ios/build/commands/runIOS/index.js并编辑getProductName(第 362-365 行)为:
function getProductName(buildOutput) {
const productNameMatch = /export FULL_PRODUCT_NAME?="?(.+).app"?$/m.exec(buildOutput);
return productNameMatch ? productNameMatch[1].replace(/(?:(.))/g, '$1') : null;
}