42 votes

Erreur : Impossible de lire la propriété 'replace' d'undefined lors de la construction de iOS Cordova

J'ai créé un projet cordova en utilisant cordova create project hello com.hello Hello .

Et ajouté la plateforme iOS en utilisant cordova platform add iOS . Et a essayé de faire cordova run ios après cordova build ios .

Mais il me montre cette erreur (j'ai utilisé --d/ --verbose pour obtenir les détails).

/usr/bin/codesign --force --sign - --t /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app : remplacement de la signature existante

** BUILD SUCCEEDED **

Aucun scripts n'a été trouvé pour le crochet "before_deploy". Erreur : TypeError : Impossible de read property 'replace' of 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

J'ai essayé de désinstaller et d'installer à nouveau cordova, mais le problème persiste.

Aidez-moi s'il vous plaît.

88voto

JedatKinports Points 2155

Nouvelle solution

Ce problème est corrigé dans la dernière version du paquetage "ios-sim" (il s'agit donc probablement de la solution la plus simple - comparée à l'ancienne qui est listée ci-dessous). Afin de mettre à jour le paquetage "ios-sim" vers la dernière version, exécutez ceci dans votre terminal/cmd :

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

Ancienne solution

Le problème est que le name_id_map[deviceName] retours undefined pour " iPad Pro (12,9 pouces) " et " iPad Pro (10,5 pouces) ".

Vous pouvez le vérifier à l'aide d'un console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]); .

J'ai corrigé ce bogue en ajoutant une instruction if qui vérifie si l'appareil est défini dans " platforms/ios/cordova/node_modules/ios-sim/src/lib.js:282 ".

Je l'ai remplacé :

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

avec ceci :

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

Le simulateur "iPad Pro (10,5 pouces)" ne sera pas sur la liste (mais il ne fonctionne probablement pas de toute façon - je n'ai pas vérifié).

Rapport de bug sur github : https://github.com/phonegap/ios-sim/issues/210

37voto

RezaRahmati Points 1807

Dans le dossier racine de votre projet, faites cd platforms/ios/cordova && npm install ios-sim

15voto

mschmitt Points 164

J'ai eu la même erreur. Pour ma part, je suis remonté jusqu'à un bogue dans platforms/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 /, '')));
    };

L'erreur est toujours apparue sous la forme "TypeError : Cannot read property 'replace' of undefined" dans lib.js:289

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

J'ai donc inséré du code de débogage :

    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;
    });

Cela a fonctionné pour moi. Bonne chance.

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

et j'ai obtenu le résultat suivant :

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

Remarquez que filterDeviceName a supprimé le caractère moins lors du remplissage du hachage. Lorsque la valeur est à nouveau récupérée, le filtre n'est pas appliqué et le programme échoue.

Correction : appliquer le filtre lors de l'écriture et de la lecture du hachage.

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

8voto

user3297914 Points 11

Il y a un PR sur Github qui a corrigé mon problème : https://github.com/phonegap/ios-sim/pull/213

Je viens d'appeler ce qui suit à l'intérieur de mon projet Root

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

et a ajouté la fonction permettant de filtrer le nom de l'appareil, comme indiqué ici : https://github.com/phonegap/ios-sim/pull/213/files

3voto

chintan adatiya Points 146

Je suis récemment passé à xcode 8.3.3 and ionic 3.4.0

J'ai supprimé le répertoire ios-sim de myApp/platforms/ios/cordova/node_modules et cela fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X