当前位置: 首页 > 知识库问答 >
问题:

错误:构建iOS Cordova时无法读取未定义的属性“replace”

徐俊楚
2023-03-14

我使用cordova create project hello com创建了一个cordova项目。你好你好。

并使用cordova platform添加iOS添加iOS平台。并尝试在cordova构建ios后执行cordova运行ios。

但它向我显示了这个错误(我使用了--d/--verbose来获取详细信息)。

/usr/bin/codesign--强制--签名---时间戳=无/卷/无标题/绘图/绘图卷/平台/ios/构建/仿真程序/绘图卷。应用程序/卷/无标题/绘图/绘图卷/平台/ios/构建/模拟器/绘图卷。应用程序:替换现有签名

**建设成功**

未找到挂钩“before\u deploy”的脚本。错误:TypeError:无法读取未定义的属性“replace”

at remove (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/ios-sim/src/lib.js:282:70)
at Array.forEach (native)
at Object.getdevicetypes (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/ios-sim/src/lib.js:292:22)
at Object.listEmulatorImages [as run] (/Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/list-emulator-images:34:29)
at deployToSim (/Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/run.js:146:50)
at /Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/run.js:88:20
at _fulfilled (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:834:54)
at self.promiseDispatch.done (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:863:30)
at Promise.promise.promiseDispatch (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:796:13)
at /Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:604:44

我已经尝试卸载和再次安装科尔多瓦,但问题仍然存在。

请帮帮我。

共有3个答案

谭吉星
2023-03-14

我也犯了同样的错误。对我来说,我将其追溯到平台/ios/cordova/node\u模块/ios sim/src/lib中的一个bug。js公司

getdevicetypes: function(args) {
...
    list.devicetypes.forEach(function(device) {
        name_id_map[ filterDeviceName(device.name) ] = device.id;
    });

    list = [];
    var remove = function(runtime) {
        // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
        list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
    };

错误总是以“TypeError:Cannot read property'replace'of undefined”的形式出现在库中。js:289

list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));

所以我插入了一些调试代码:

    list.devicetypes.forEach(function(device) {
        console.log('test 1 ' + device.name);
        console.log('test 2 ' + filterDeviceName(device.name));
        name_id_map[ filterDeviceName(device.name) ] = device.id;
    });

这对我有用。祝你好运

    list = [];
    var remove = function(runtime) {
        // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
        console.log('remove 1 ' + runtime);
        console.log('remove 2 ' + deviceName);
        console.log('remove 3 ' + name_id_map[ deviceName ]);
        list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
    };

并得到以下输出:

test 1 iPhone 5
test 2 iPhone 5
test 1 iPad Pro (9.7-inch)
test 2 iPad Pro (9.7 inch)
remove 1 iOS 10.2
remove 2 iPhone 5
remove 3 com.apple.CoreSimulator.SimDeviceType.iPhone-5
remove 1 iOS 10.2
remove 2 iPad Pro (9.7-inch)
remove 3 undefined

请注意filterDeviceName在填充哈希时是如何删除减号的。再次检索该值时,将不应用过滤器,程序将失败。

错误修复:在写入和读取哈希时应用过滤器。

 list.push(util.format('%s, %s', name_id_map[ filterDeviceName(deviceName) ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
云煌
2023-03-14

在项目文件夹根目录中,执行cd Platform/ios/cordova

岳嘉悦
2023-03-14

新解决方案

此问题已在最新版本的“ios sim”软件包中修复(因此,与下面列出的旧解决方案相比,这可能是更简单的解决方案)。要将“ios sim”软件包更新为最新版本,请在终端/cmd中运行以下命令:

cd platforms/ios/cordova/node_modules/
sudo npm install -g ios-sim@latest

旧解决方案

问题是name_id_map[deviceName]返回"iPad Pro(12.9英寸)"和"iPad Pro(10.5英寸)"的un定义

您可以使用控制台进行检查。log('name\u id\u map[设备名称]:'name\u id\u map[设备名称])

我通过添加if语句修复了这个bug,该语句检查设备是否在“platforms/ios/cordova/node\u modules/ios-sim/src/lib.js:282”中定义。

我替换了这个:

list = [];
        var remove = function(runtime) {
            // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
            list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
        };

有了这个:

list = [];
        var remove = function(runtime) {
            // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
            if (name_id_map[deviceName] && runtime) {
                list.push(util.format('%s, %s', name_id_map[deviceName].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
            }
        };

“iPad Pro(10.5英寸)”模拟器不会在列表中(但它可能无论如何都不起作用——没有检查)。

github上的错误报告:https://github.com/phonegap/ios-sim/issues/210

 类似资料:
  • 我有一个旧的科尔多瓦项目,我正在更新。作为这个过程的一部分,我删除了android平台并重新阅读了它。 现在,当我尝试构建项目时,出现以下错误: 这在我删除平台之前确实起到了作用,所以我猜是一个bug或一个配置文件发生了变化。 这里有一个类似的问题:https://pt.stackoverflow.com/questions/219442/cordova-build-android-error-c

  • 问题内容: 我是Reactjs的新手。我正在尝试做一个非常简单的事情:当用户在文本区域内更改文本时,在render函数中更新div。有什么建议? 问题答案: 您应该绑定该函数。您收到此错误的原因是,在handleChange函数中,键盘操作未引用React类的上下文,因此您需要绑定该函数。 看到这个答案

  • 我搜索了这个网站,发现了类似的问题,但没有解决我的问题。当我滚动到一个div时,我试图使它固定在屏幕顶部。但我一直在犯错误: "(index): 59未捕获类型错误:无法读取未定义的属性'top'at(index): 59" 我还在学习jQuery,不能解决这个问题。

  • 问题内容: 我正在使用jQuery将表单字段发布到PHP文件,该文件仅根据是否工作而返回1/0。 代码摘录: 但是,每次成功(html == 1)时,控制台都会引发错误“未捕获的TypeError:无法读取未定义的属性’defaultView’”,并且警报永远不会发生…? Google似乎没有关于此错误和jQuery的大量信息,谁知道原因? 问题答案: 这是因为以前不是您要处理的内容,现在是jQu

  • 我的代码: 错误: 未处理PromisejectionWarning:TypeError:无法读取未定义的未处理PromisejectionWarning:未处理的promise拒绝的属性“forEach”。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。(拒绝id:1)(节点:7188)[DEP0018]弃用警告:未处理的promise

  • 我正在尝试集成一个Datatable插件(https://www.npmjs.com/package/vuejs-datatable)在我的Vue应用程序中,我的控制台出现了一个错误。 我的dataTable.vue文件: 每当我尝试使用Vue时。使用(PluginName)'当集成插件时,我会遇到类似的错误。我是VueJS的新手。有什么我需要做的吗?