wake-up-neo.com

Fehler: Die Eigenschaft 'replace' von undefined kann beim Erstellen von iOS Cordova nicht gelesen werden

Ich habe ein Cordova-Projekt mit cordova create project hello com.hello Hello Erstellt.

Und iOS-Plattform mit cordova platform add iOS Hinzugefügt. Und versucht, cordova run ios Nach cordova build ios Zu machen.

Aber es zeigt mir diesen Fehler (ich habe --d/--verbose verwendet, um die Details zu erhalten).

/ usr/bin/codesign --force --sign - --timestamp = none /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app/Volumes/Untitled/Plot/PlotReel/platform/ios /build/emulator/PlotReel.app: Bestehende Signatur ersetzen

** BUILD ERFOLGREICH **

Keine Skripte für Hook "before_deploy" gefunden. Fehler: TypeError: Die Eigenschaft 'replace' von undefined kann nicht gelesen werden

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

Ich habe versucht, Cordova erneut zu deinstallieren und zu installieren, aber das Problem bleibt bestehen.

Bitte hilf mir.

42
Zachary Bell

Neue Lösung

Dieses Problem wurde in der neuesten Version des "ios-sim" -Pakets behoben (daher ist dies jetzt wahrscheinlich die einfachere Lösung - verglichen mit der alten, die unten aufgeführt ist). Um das "ios-sim" -Paket auf die neueste Version zu aktualisieren, führen Sie dies in Ihrem Terminal/cmd aus:

cd platforms/ios/cordova/node_modules/
Sudo npm install -g [email protected]

Alte Lösung

Das Problem ist, dass der name_id_map[deviceName]undefined für " iPad Pro (12,9 Zoll)" und " iPad Pro (10,5 Zoll) zurückgibt. ".

Sie können dies mit einer console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]); überprüfen.

Ich habe diesen Fehler behoben, indem ich eine if-Anweisung hinzugefügt habe, die überprüft, ob das Gerät in " platform/ios/cordova/node_modules/ios-sim/src/lib.js: 282" definiert ist.

Ich habe das ersetzt:

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

mit diesem:

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

Der "iPad Pro (10,5 Zoll)" - Simulator wird nicht auf der Liste stehen (aber er funktioniert wahrscheinlich sowieso nicht - hat nicht geprüft).

Fehlerbericht auf Github: https://github.com/phonegap/ios-sim/issues/21

88
Tadej

mache in deinem Projektordner root cd platforms/ios/cordova && npm install ios-sim

37
Reza

Ich hatte den gleichen fehler Für mich habe ich dies auf einen Fehler in platform/ios/cordova/node_modules/ios-sim/src/lib.js zurückgeführt

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

Der Fehler trat immer als "TypeError: Eigenschaft 'replace' von undefined kann nicht gelesen werden" in lib.js: 289 auf

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

Also habe ich einen Debug-Code eingefügt:

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

Das hat bei mir funktioniert. Viel Glück.

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

und bekam folgende Ausgabe:

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

Beachten Sie, wie filterDeviceName das Minuszeichen beim Füllen des Hash entfernt hat. Wenn der Wert erneut abgerufen wird, wird der Filter nicht angewendet und das Programm schlägt fehl.

Fehlerbehebung: Wenden Sie den Filter an, während Sie in den Hash schreiben und daraus lesen.

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

Es gibt eine PR auf Github, die mein Problem behoben hat: https://github.com/phonegap/ios-sim/pull/21

Habe gerade folgendes in meinem Projekt root aufgerufen

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

und fügte die Funktion zum Filtern des Gerätenamens hinzu, wie hier ausgeführt: https://github.com/phonegap/ios-sim/pull/213/files

8
Hirbod

Ich habe kürzlich auf xcode 8.3.3 and ionic 3.4.0 Upgreaded

Ich habe das ios-sim-Verzeichnis aus myApp/platform/ios/cordova/node_modules entfernt und jetzt funktioniert es.

3
chintan adatiya

Ich bin gerade darauf gestoßen und dachte, ich würde etwas hinzufügen, das für mich funktioniert hat - die Lösung npm install ios-sim nicht.

Alles, was ich getan habe, war, XCode zu öffnen und es zeigte auf Generic iOS Device, als ich es zum letzten Mal zum Testen einer App auf einem physischen Gerät verwendet habe. Ich habe den iOS-Simulator so geändert, dass er auf der Liste der iOS-Simulatoren steht. Ich habe es erneut versucht und es hat wie ein Zauber funktioniert!

Hoffe, dies könnte jemand anderem in der gleichen Situation helfen.

2
CYMR0

Das Aktualisieren der ios-sim-Version mit npm install [email protected] Hat bei mir nicht funktioniert. Aber wenn auf Github eine nette und einfache Lösung gefunden wird.

  1. Öffne /platforms/ios/cordova/node_modules/ios-sim/src/lib.js
  2. Suchen Sie mit Ihrem Code-Editor nach deviceName
  3. Ersetzen Sie name_id_map[ deviceName ] Durch name_id_map[filterDeviceName(deviceName)]

Sie finden den Github-Beitrag hier

1
Eyk Rehbein

Eine andere Möglichkeit ist die Verwendung eines cordova-ios Version mit dem ios-sim Patch bereits implementiert

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

Beachten Sie, dass dies keine offizielle Version von Apache Cordova ist. Diese Version wird in der nächsten Version 4.4.1 enthalten sein.

1
jcesarmobile

Ich habe folgende Befehle ausgeführt und es löst mein Problem:

cd project_dir

Sudo npm installiere ios-sim @ spätestens

0
Deepak Bhatta