web-dev-qa-db-ja.com

エラー:iOS Cordovaのビルド時に未定義のプロパティ 'replace'を読み取れません

cordova create project hello com.hello Helloを使用してcordovaプロジェクトを作成しました。

cordova platform add iOSを使用してiOSプラットフォームを追加しました。そして、cordova run iosの後にcordova build iosを実行しようとしました。

しかし、このエラーは表示されます(詳細を取得するために--d/--verboseを使用しました)。

/ 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:既存の署名を置き換える

**成功しました**

フック「before_deploy」のスクリプトが見つかりませんでした。エラー:TypeError:未定義のプロパティ 'replace'を読み取れません

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

コルドバを再度アンインストールしてインストールしようとしましたが、問題はまだ残っています。

私を助けてください。

42
Zachary Bell

新しいソリューション

この問題は、「ios-sim」パッケージの最新バージョンで修正されています(したがって、これはおそらく、以下にリストされている古いものと比較して、より簡単なソリューションです)。 「ios-sim」パッケージを最新バージョンに更新するには、ターミナル/ cmdでこれを実行します。

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

古いソリューション

問題は、「iPad Pro(12.9インチ)」および「iPad Pro(10.5インチ)に対してname_id_map[deviceName]undefinedを返すことです)」。

console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]);で確認できます。

デバイスが「platforms/ios/cordova/node_modules/ios-sim/src/lib.js:282」で定義されているかどうかを確認するifステートメントを追加して、このバグを修正しました。 。

私はこれを置き換えました:

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

これとともに:

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

「iPad Pro(10.5-inch)」シミュレーターはリストにありません(しかし、おそらくとにかく動作しないでしょう-チェックしませんでした)。

Githubのバグレポート: https://github.com/phonegap/ios-sim/issues/21

88
Tadej

プロジェクトフォルダのルートで、cd platforms/ios/cordova && npm install ios-simを実行します

37
Reza

同じエラーが発生しました。私にとっては、これを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 /, '')));
    };

このエラーは常に、lib.js:289で「TypeError:undefinedのプロパティ 'replace'を読み取れません」として発生しました。

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

そこで、デバッグコードを挿入しました。

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

これは私のために働いた。幸運を。

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

そして、次の出力を得ました:

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

FilterDeviceNameがハッシュを埋めるときにマイナス文字を削除したことに注意してください。値が再度取得されると、フィルターは適用されず、プログラムは失敗します。

バグ修正:ハッシュの読み書き中にフィルターを適用します。

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

私の問題を修正したGithubのPRがあります: https://github.com/phonegap/ios-sim/pull/21

私のプロジェクトルート内で次のように呼ばれました

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

ここで指摘されているように、デバイス名をフィルタリングする機能を追加しました: https://github.com/phonegap/ios-sim/pull/213/files

8
Hirbod

最近xcode 8.3.3 and ionic 3.4.0にアップグレードしました

MyApp/platforms/ios/cordova/node_modulesからios-simディレクトリを削除しましたが、現在は機能しています。

3
chintan adatiya

私はちょうどこれに遭遇し、私のために働く何かを追加するだろうと思った-ソリューションnpm install ios-simはしませんでした。

私がしたことは、XCodeを開いて、Generic iOS Deviceを指していたのは、物理デバイスでアプリをテストするときに最後に使用したときからでした。 iOSシミュレーターをiOSシミュレーターのリストにあるものに変更し、再試行したところ、魅力的に機能しました!

これが同じ状況の他の誰かを助けるかもしれないことを願っています。

2
CYMR0

Ios-simバージョンをnpm install ios-sim@latestで更新してもうまくいきませんでした。しかし、Githubで素敵で簡単なソリューションが見つかった場合。

  1. /platforms/ios/cordova/node_modules/ios-sim/src/lib.jsを開きます
  2. コードエディターでdeviceNameを検索します
  3. name_id_map[ deviceName ]name_id_map[filterDeviceName(deviceName)]に置き換えます

Githubの投稿を見つけることができます こちら

1
Eyk Rehbein

別のオプションは、cordova-iosパッチが既に実装されているios-simバージョンを使用することです

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

これはApache Cordovaの公式リリースではないことに注意してください。これは次の4.4.1バージョンに含まれます。

1
jcesarmobile

私は次のコマンドを実行しましたが、それは私の問題を解決します:

cd project_dir

Sudo npm install ios-sim @ latest

0
Deepak Bhatta