Error: Cannot read property 'replace' of undefined when building iOS Cordova

前端 未结 9 1381
醉话见心
醉话见心 2020-12-23 09:32

I created a cordova project using cordova create project hello com.hello Hello.

And added iOS platform using cordova platform add iOS. And

相关标签:
9条回答
  • 2020-12-23 10:02

    in your project folder root, do cd platforms/ios/cordova && npm install ios-sim

    0 讨论(0)
  • 2020-12-23 10:12

    Updating the ios-sim version with npm install ios-sim@latest didn't worked for me. But if found a nice and easy solution on Github.

    1. Open /platforms/ios/cordova/node_modules/ios-sim/src/lib.js
    2. Search for deviceName with your code editor
    3. Replace name_id_map[ deviceName ] with name_id_map[filterDeviceName(deviceName)]

    You can find the Github post here

    0 讨论(0)
  • 2020-12-23 10:14

    New solution

    This issue is fixed in the latest version of the "ios-sim" package (so now this is probably the easier solution - compared to the old one which is listed below). In order to update the "ios-sim" package to the latest version run this in your terminal/cmd:

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

    Old solution

    The problem is that the name_id_map[deviceName] returns undefined for "iPad Pro (12.9-inch)" and "iPad Pro (10.5-inch)".

    You can check it with a console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]);.

    I fixed this bug by adding an if statements which checks if the device is defined in "platforms/ios/cordova/node_modules/ios-sim/src/lib.js:282".

    I replaced this:

    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 /, '')));
            };
    

    with this:

    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 /, '')));
                }
            };
    

    The "iPad Pro (10.5-inch)" simulator won't be on the list (but it doesn't probably work anyway - didn't check).

    Bug report on github: https://github.com/phonegap/ios-sim/issues/210

    0 讨论(0)
  • There is a PR on Github which fixed my problem: https://github.com/phonegap/ios-sim/pull/213

    Just called following inside my project root

    nano platforms/ios/cordova/node_modules/ios-sim/src/lib.js
    

    and added the function to filter the device name, as pointed out here: https://github.com/phonegap/ios-sim/pull/213/files

    0 讨论(0)
  • 2020-12-23 10:18

    I have just run into this and thought I'd add something that worked for me - the solution npm install ios-sim didn't.

    All I did was open up XCode and it was pointing to Generic iOS Device from when I last used it with testing an app on a physical device. I just changed the iOS Simulator to be anything on the iOS Simulator list, retried it and it worked like a charm!

    Hope this might help somebody else in the same situation.

    0 讨论(0)
  • 2020-12-23 10:20

    I recently upgreaded to xcode 8.3.3 and ionic 3.4.0

    I have removed ios-sim directory from myApp/platforms/ios/cordova/node_modules and now it's working.

    0 讨论(0)
提交回复
热议问题