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.
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
dans la racine du dossier de votre projet, faites cd platforms/ios/cordova && npm install ios-sim
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 /, '')));
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
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.
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.
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.
/platforms/ios/cordova/node_modules/ios-sim/src/lib.js
deviceName
avec votre éditeur de codename_id_map[ deviceName ]
Par name_id_map[filterDeviceName(deviceName)]
Vous pouvez trouver le post Github ici
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.
J'ai exécuté les commandes suivantes et cela résout mon problème:
cd project_dir
Sudo npm installe ios-sim @ dernier