proyecto - Error: No se puede leer la propiedad ''reemplazar'' de indefinido al construir iOS Cordova
crear proyecto phonegap (9)
Actualizar la versión de ios-sim con npm install ios-sim@latest
no funcionó para mí. Pero si encuentra una solución agradable y fácil en Github.
- Abre
/platforms/ios/cordova/node_modules/ios-sim/src/lib.js
- Busque
deviceName
con su editor de código - Reemplazar
name_id_map[ deviceName ]
conname_id_map[filterDeviceName(deviceName)]
Puedes encontrar el post de Github https://github.com/phonegap/ios-sim/pull/213/files
cordova create project hello com.hello Hello
un proyecto de cordova usando cordova create project hello com.hello Hello
.
Y la plataforma iOS agregada usando la cordova platform add iOS
. Y traté de hacer cordova run ios
después de cordova build ios
.
Pero me muestra este error (utilicé --d / --verbose para obtener los detalles).
/ usr / bin / codesign --force --sign - --timestamp = none /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app / Volumes / Untitled / Plot / PlotReel / platforms / ios /build/emulator/PlotReel.app: reemplazando la firma existente
** CONSTRUYE ÉXITO **
No se encontraron scripts para el enlace "before_deploy". Error: TypeError: no se puede leer la propiedad ''replace'' de undefined
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
He intentado desinstalar e instalar Cordova de nuevo, pero el problema aún persiste.
Por favor, ayúdame.
Hace poco comencé a xcode 8.3.3 and ionic 3.4.0
He eliminado el directorio ios-sim de myApp / platforms / ios / cordova / node_modules y ahora está funcionando.
Hay un PR en Github que solucionó mi problema: github.com/phonegap/ios-sim/pull/213
Recién llamé siguiendo dentro de mi raíz del proyecto
nano platforms/ios/cordova/node_modules/ios-sim/src/lib.js
y agregó la función para filtrar el nombre del dispositivo, como se señala aquí: https://github.com/phonegap/ios-sim/pull/213/files
He ejecutado los siguientes comandos y resuelve mi problema:
cd project_dir
sudo npm instala ios-sim @ latest
Me acabo de topar con esto y pensé que agregaría algo que funcionó para mí: la solución npm install ios-sim
no lo hizo.
Todo lo que hice fue abrir XCode y apuntó a Dispositivo Genérico iOS desde la última vez que lo usé para probar una aplicación en un dispositivo físico. ¡Acabo de cambiar el simulador de iOS para que sea cualquier cosa en la lista del simulador de iOS, lo reintenté y funcionó como un amuleto!
Espero que esto pueda ayudar a alguien más en la misma situación.
Otra opción es usar una versión cordova-ios
con el parche ios-sim
ya implementado
cordova platform add https://github.com/apache/cordova-ios.git#4.4.0-ios-sim
Tenga en cuenta que este no es un lanzamiento oficial de Apache Cordova, esto se incluirá en la próxima versión 4.4.1.
Yo tenía el mismo error. Para mí rastreé esto en un error en las plataformas / ios / cordova / node_modules / ios-sim / src / lib.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 /, '''')));
};
El error siempre ocurre como "TypeError: no se puede leer la propiedad ''replace'' of undefined" en lib.js: 289
list.push(util.format(''%s, %s'', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''''), runtime.replace(/^iOS /, '''')));
Así que inserté un código de depuración:
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;
});
Esto funcionó para mí. Buena suerte.
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 /, '''')));
};
y obtuve el siguiente resultado:
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
Observe cómo filterDeviceName eliminó el carácter menos al completar el hash. Cuando el valor se recupera nuevamente, el filtro no se aplica y el programa falla.
Corrección de errores: aplique el filtro mientras escribe y lee desde el hash.
list.push(util.format(''%s, %s'', name_id_map[ filterDeviceName(deviceName) ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''''), runtime.replace(/^iOS /, '''')));
en la raíz de su carpeta de proyecto, haga cd platforms/ios/cordova && npm install ios-sim
Nueva solución
Este problema está resuelto en la última versión del paquete "ios-sim" (por lo que ahora esta es probablemente la solución más sencilla, en comparación con la anterior que se enumera a continuación). Para actualizar el paquete "ios-sim" a la última versión, ejecute esto en su terminal / cmd:
cd platforms/ios/cordova/node_modules/
sudo npm install -g ios-sim@latest
Vieja solución
El problema es que name_id_map[deviceName]
devuelve undefined
para " iPad Pro (12.9 pulgadas) " y " iPad Pro (10.5 pulgadas) ".
Puede verificarlo con console.log(''name_id_map[ deviceName ]: '' + name_id_map[ deviceName ]);
.
Arreglé este error agregando una instrucción if que verifica si el dispositivo está definido en " plataformas / ios / cordova / node_modules / ios-sim / src / lib.js: 282 ".
Reemplacé esto:
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 /, '''')));
};
con este:
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 /, '''')));
}
};
El simulador "iPad Pro (10.5 pulgadas)" no estará en la lista (pero probablemente no funcione de todos modos, no lo hizo).
Informe de error en github: https://github.com/phonegap/ios-sim/issues/210