web-dev-qa-db-fra.com

Erreur: Impossible de lire la propriété 'remplacer' de non définie lors de la création d'iOS Cordova

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

Et ajouté la plate-forme iOS en utilisant cordova platform add iOS. Et 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 - --timestamp = none /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app/Volumes/Untitled/Plot/PlotReel/plateformes/ios /build/emulator/PlotReel.app: remplacement de la signature existante

** BUILD SUCCEEDED **

Aucun script trouvé pour le hook "before_deploy". Erreur: TypeError: Impossible de lire la propriété 'remplacer' de non définie

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é à nouveau de désinstaller et d'installer Cordova, mais le problème persiste.

Aidez-moi, s'il vous plaît.

42
Zachary Bell

Nouvelle solution

Ce problème a été résolu dans la dernière version du package "ios-sim" (il s'agit donc probablement de la solution la plus simple, comparée à l'ancienne solution ci-dessous). Afin de mettre à jour le paquet "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] Renvoie undefined pour " iPad Pro (12,9 pouces) " et " iPad Pro (10,5 pouces) ".

Vous pouvez le vérifier avec une console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]);.

J'ai corrigé ce bogue en ajoutant une instruction if qui vérifie si le périphérique est défini dans " plates-formes/ios/cordova/node_modules/ios-sim/src/lib.js: 282 ".

J'ai remplacé ceci:

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 ça:

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 dans la liste (mais cela 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/21

88
Tadej

dans la racine du dossier de votre projet, faites cd platforms/ios/cordova && npm install ios-sim

37
Reza

J'ai eu la même erreur. Pour moi, j'ai tracé ceci dans un bogue dans plates-formes/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 s'est toujours produite en tant que "TypeError: Impossible de lire la propriété 'remplacer' de non définie" 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 a obtenu la sortie suivante:

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 comment 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.

Correctif: appliquez 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 /, '')));
15
mschmitt

Il existe un PR sur Github qui a résolu mon problème: https://github.com/phonegap/ios-sim/pull/21

Vient d'appeler ce qui suit dans la racine de mon projet

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

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

8
Hirbod

J'ai récemment grandi à xcode 8.3.3 and ionic 3.4.0

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

3
chintan adatiya

Je viens juste de le rencontrer et je pensais ajouter quelque chose qui fonctionnait pour moi - la solution npm install ios-sim pas.

Tout ce que je faisais était d'ouvrir XCode et il pointait vers Périphérique iOS générique depuis la dernière fois que je l'ai utilisé pour tester une application sur un périphérique physique. Je viens de changer le simulateur iOS pour qu'il ne soit plus sur la liste du simulateur iOS, je l'ai retenté et cela a fonctionné à merveille!

J'espère que cela pourra aider quelqu'un d'autre dans la même situation.

2
CYMR0

La mise à jour de la version de ios-sim avec npm install ios-sim@latest N'a pas fonctionné pour moi. Mais si trouvé une solution simple et agréable sur Github.

  1. Ouvrez /platforms/ios/cordova/node_modules/ios-sim/src/lib.js
  2. Recherchez deviceName avec votre éditeur de code
  3. Remplacez name_id_map[ deviceName ] Par name_id_map[filterDeviceName(deviceName)]

Vous pouvez trouver le post Github ici

1
Eyk Rehbein

Une autre option consiste à utiliser un cordova-ios version avec le ios-sim patch déjà mis en oeuvre

cordova platform add https://github.com/Apache/cordova-ios.git#4.4.0-ios-sim

Attention, ce n'est pas une version officielle d'Apache Cordova, elle sera incluse dans la prochaine version 4.4.1.

1
jcesarmobile

J'ai exécuté les commandes suivantes et cela résout mon problème:

cd project_dir

Sudo npm installe ios-sim @ dernier

0
Deepak Bhatta