Xcode6:シミュレーターの2つのインスタンスを実行する


122

iOSアプリには2つの異なるターゲットがあります。シミュレータの2つの異なるインスタンスで2つのアプリを同時に実行することはできますか?Xcodeのデバッガーを利用する必要がない場合は問題ありません。これまでのところ、私が見つけた唯一の解決策は、XCodeの2つのバージョンをインストールすることでしたが、これは非常に重い/スペースを消費する解決策です。



3
これは重複した質問ですが、@ i40westの方が実際には優れています。
vintagexav 2014年

実際には、ここでの答えはさらに良いですstackoverflow.com/questions/896487/...
FlowUI。SimpleUITesting.com

回答:


224

コマンドラインからiOSシミュレーターの2つのインスタンスを実行できます。これらはXcodeのデバッグにアタッチされません。実際、Xcodeをまったく実行せずに行う場合にのみ機能するようです。

まず、シミュレータにアプリをインストールするために、Xcodeからアプリをシミュレータで実行する必要があります。最終的に使用するのと同じシミュレータを実行していることを確認してください

ターミナルウィンドウを開き、これを実行します。

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n iOS\ Simulator.app
open -n iOS\ Simulator.app

Xcode 7の更新: Xcode 7では、シミュレーターのアプリケーション名が変更されたため、代わりに次のようになります。

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n Simulator.app
open -n Simulator.app

2つ目が起動すると、エラーアラートが表示されます。それを閉じて、「ハードウェア」»「デバイス」から別のデバイス選択するだけです。これで、2つのシミュレーターが実行され、Xcodeから既にインストールされているアプリがすべて表示されます。


7
よろしくお願いします。それは良い考えですが、残念ながら、2つ目のシミュレーターに対して「現在の状態ではデバイスを起動できません:起動しました」と表示されます。2つのシミュレータが表示されますが、2番目のシミュレータの画面は、アラートを無視した後も黒いままです。
vintagexav 2014年

6
多分それは私のXCodeが現在実行されているためです。多分あなたはあなたの答えにその指示を追加する必要があります:)また、それは2つの異なるシミュレートされたハードウェア(例えばiPhone 5とiPhone 5s)を使用している場合のみ機能します
vintagexav

13
ちなみに、2つの異なるシミュレーションハードウェアで2つの異なるシミュレータを適切に実行し、「現在の状態ではデバイスを起動できません:起動」を回避するには、シミュレータ>ハードウェアをクリックして、起動後に最初のシミュレータのバージョンを変更する必要があります。さらに詳しい情報:stackoverflow.com/questions/24023029/...
vintagexav

1
ありがとう!2つのシミュレーター(1つはiPhone5、もう1つはiPhone6を実行)を使用してiCloud同期をテストしています。なお、シミュレーターの同期は細心の注意が必要なため、実用的な目的のために、Debug-> Trigger iCloud Syncを使用してiCloud同期を強制する必要があります。したがって、これらの2つのデバイスが別々のシミュレーターウィンドウでアプリケーションを実行している状態で、device1(iphone5)に変更を加え、device1を強制的に同期し、device2(iPhone6)にクリックして強制的に同期します。そしてビオラ、シミュレーターでiCloud同期をテストできるようになりました。シミュレーターのコンソールを開くと、バックグラウンド同期のアクティビティを確認できるので便利です。
ObjectiveTC

3
お返事を見つけてよかったですありがとうございます!次の点に注意して、XCodeを同時に実行できることをお伝えしておきます。1。2番目のシミュレータは最初のシミュレータとは異なる構成にする必要があります(ポップアップのエラーが発生した後、シミュレータのデバイスバージョンを変更する必要があります)ハードウェアメニューから)。2. XCodeから最初のシミュレーターを停止して再起動すると、2番目のシミュレーターも停止して再起動します(デバイスのバージョンを再度変更する必要があります)
Alex

26

Xcode 9以降

Xcode 9は、複数のシミュレーターの起動をサポートするようになりました。これはWWDC 2017で発表されました。

Xcode、Cmd + Rでシミュレーターを変更するだけで、新しいシミュレーターがポップアップ表示されます。

ここに画像の説明を入力してください


9

i40westのソリューションが手動でシミュレーターを起動するように機能することを正常にテストしましたが、現在の時代では、iOSシミュレーターはコマンドラインから同時テストを実行するときに異なるXcodeバージョンと異なるデバイスタイプを必要とする(使用例は少し異なりますが、最初の質問に関連しています) )。

コマンドラインのビルドとテストに最も関連するAppleの記事を参照してください:https : //developer.apple.com/library/ios/technotes/tn2339/_index.html

正しい--args-を 'iOS Simulator.app'に渡してから 'xcodebuild test'コマンドを実行し、正しい '-destination'値と一致するシミュレーターの起動を 'xcrunの出力からのUUIDの値で実行すると、複数の同時テストで問題なく機能しましたsimctl list '、およびDEVELOPER_DIR環境変数を設定して、異なるXCodeバージョンのバイナリ(つまり、Xcode 6.1および6.4へのベースパス)を選択する

同じ物理マシン、同じiPadやiPhoneなどのiOSシミュレーターデバイス、同じXcodeバージョンでユニットテストを同時に実行する必要がある理由は、同じビルドシステムで複数のビルドを複数実行できるように、iOSプロジェクトのCI(継続的インテグレーション)をサポートするためですアプリ(私たちの会社は30個程度のアプリを持っています)は、機能ブランチのチェックイン時に一度に自動的にスキャンされ、他の実行中のビルドが完了するのを待つ必要なくBambooエージェントによってビルドされます-Bambooはこのタイプの自動ビルドを自動でサポートします-有効になっている場合、機能ブランチを検出しました。

複数の同時テストを実行するとどうなるかについては、異なるTerminal.appウィンドウで複数の「xcodebuild test」コマンドを続けて2回実行すると、結果は1つのシミュレーターウィンドウだけになり、テストは最も単純なテストで失敗します。

テスト起動のエントリ基準を複雑にする場合、シムとテスト起動ごとに異なるXcodeバージョンを使用し、manページ(xcodebuildテスト)に従ってDEVELOPER_DIRを使用する場合、2つの異なるウィンドウで開く別のデバイスを指定しますが、結果は次のようになります。最初のウィンドウで実行中のテストはすべて、2番目のiOSシミュレーターウィンドウによって中断されます。

フードの下に共通の共有リソースがあるように見えますが、意図したものではないか、悪影響が出ないように並行テスト実行をより適切に実装する方法について数日以上真剣に検討する必要のある新機能です。

私たちの経験や他の人たちの一般的な経験では、多数の小さなファイルを含むVMでのiOSビルドのパフォーマンスは物理ハードウェアよりも遅いため、VMを使用してシミュレーションの制限を回避したくありません。VMは通常、VMwareソフトウェアとAppleハードウェアおよび/またはファームウェアの組み合わせにおけるI / Oの問題により、ビルドを大幅に遅くします。virtuallyghettoは申し訳ありませんが、私たちにとってVMはうまく機能しません-virtuallyghettoサイトでは、ビルドファーム用にMac MiniにESXi 5.5をインストールする方法についての説明を提供しています。

Mac MiniでのESXi 5.5のビルドパフォーマンスの問題は、SSDでもベアメタルよりも2倍以上遅いことを経験しました(つまり、10分のベアメタルビルドはVMで20かかります)。理由については、以下の記事を参照してください。

https://corner.squareup.com/2015/07/ios-build-infrastructure.html

xcodebuildユニットテストで一度に1つのsimデバイスを制限すると、生産性が大幅に低下し、アップルとエコシステムに大幅なコストが追加されます。

ハードウェアの購入を正当化するために同時実行性をサポートしないというAppleのコストは慎重に検討する必要があり、シムとEULAに関して制限の少ない他の競合他社と開発者の速度を失うリスクを比較検討する必要があります。

同じユーザーログインでの同時テストの利点(ほとんどのCIシステムが機能する方法)は、Appleブランドのアプリストアアプリの品質が、そもそもiOSデバイスを購入するきっかけにもなっていることです。ソフトウェア品質が低いため、ブランド全体が少し鈍くなり、iOSシミュレーターでの同時実行サポートがエコシステムをサポートするための賢明な方法のように思われます。当面の問題の帰結として、CI用のAppleのXcodeサーバー、Xcode 7のXcodeの自動UIテスト機能などの最近の改善があります。

すべてのマシン、ネットワーク、電源ポイントなどをサポートするために必要な多数の人々は言うまでもなく、人々に大量のハードウェア、セットアップ、構成を購入させるために不必要なオーバーヘッドを奨励すると、誰もがAppleやシミュレータでの同時テストをサポートするために、MacProまたはMac Miniのラックを購入することができます。シミュレータの重要なポイントは、ハードウェアの使用を避け、テストの速度を上げることです。

さらに、VMに関するEULAの制限により、Mac ProのVMは非常に脆弱です。このハードウェアタイプは、複数のシミュレーションを実行できる場合に魅力的ですが、同時ユニットテストがサポートされていないため(上記の2つの条件-異なるXCodeバージョンと異なるシミュレーターデバイスを除く)、ビルドインフラストラクチャにはMac Miniを使用します。

AppleによるこれらのシミュレーションとEULAの制限により、ビルドパイプラインが遅くなるだけでなく、不必要な複雑さとコストが追加されます。小さなアプリの場合はそれほど心配する必要はありませんが、アプリのサイズと複雑さが大きくなると、ビルドに1時間以上かかることがあります(Facebook iOSのビルドにはそれだけ時間がかかると聞きました)。ビルドが成功したかどうかを知るために1時間待つ必要はありません。

Mac MiniでのESXI VMの実行など、最新のMac Book ProやMac Mini、または別のログインアカウントでのビルドに10分以上かかるビルドを持つ大規模なプロジェクトでは、xcodebuildのパフォーマンスが上手く機能しないハックソリューションを知っています。同じXcodeバージョンと同じシミュレーターデバイスで同時テストを実行できるようにするために、ベアメタルマシンで環境に接続します。

ESXiは十分に機能しますが、正式にはサポートされていません。VMwareがMac Miniハードウェアをまだサポートしていない理由の1つはECCメモリがないことですが、Mac ProはECCメモリを備えているためサポートされていますが、iOSビルドに関してMac Miniと同じ問題がベアメタルと比較して遅くなります。同じハードウェアおよびソフトウェア構成でのテスト(変更点はVMとOS Xを実行するベアメタルのみです)。MacProは現時点ではテストされていません。私たちの経験では、VMware Fusionのパフォーマンスも非常に遅いです。

さらに重要なのは、マシンのプールが変更のパイプラインをサポートするのに十分な大きさでない限り、開発者は前述の問題が複合するとき、より長く待つ必要があります(2つの開発ごとに1つのCIビルド、開発者に対するマシンの比率が非常に高い)。CIビルドマシンは、1よりも多くの同時ビルドと同時テストを実行できる必要があります。

iOSシミュレータに関する他の観察結果の1つは、それらが進行中の作業であり、7つのメジャーバージョンの後でも完全に完成していないように見えることです。'xcrun simctl'サブコマンドには--setオプションがあります。これにより、ある種の柔軟性が得られる可能性がありますが、有効な値がどれであるかは不明で、-noxpcと同じです。だれも適切な値を推測する必要はありません。さらに、このオプションとおそらく例をカバーするmanページがあるはずです。これら2つの興味深いオプションの使用例は何ですか?

モノリシックアプリが問題であるため、同時実行テストの実行を保証し、XPCに基づくより優れたアーキテクチャを利用できるように設計されたアプリはありません。これは非常に正しい可能性があり、私たちが期待するほど実用的なソリューションではありません。同じインフラストラクチャ上に20以上のアプリを構築する必要がある場合は、問題が残ります。

マシンの構成とプロセスを可能な限り汎用的かつスケーラブルにしてスループットを高めるには、シミュレーター(アプリ+コア開発者)での作業が必要になります。また、すべてのAppleシミュレータ開発者とシミュレータ製品の所有者との間の高度なコラボレーションが必要であり、この問題について注意を引くために、製品のバックログを正しく注文する必要があります:-)



5

異なるハードウェアプロファイルに対してシミュレータの複数のインスタンスを実行し、それらをデバッグできます。まず、アプリをシミュレータインスタンスにインストールするには、ハードウェアの種類(iPhone 6、iPadなど)ごとにXCodeからアプリを実行する必要があります。次に、上記で説明したように、シミュレータインスタンスとアプリを実行します。デバッグするには、「XCode-> Debug-> Attach to Process」メニューから実行中のプロセスにデバッガーをアタッチできます。このブログエントリの例を確認できます。http//oguzdemir.dualware.com/?p = 43


5

ここに.shの小さなスクリプトを使用して、コンピューター上のシミュレーターのUDIDをリストし、実行します。以下のコードを拡張子「.sh」のファイルにコピーし、ターミナルで実行します。

方法:

ステップ1.オプション1でデバイスをリストし、必要なUDIDをコピーする

ステップ2.オプション2を実行してUDIDを貼り付け、Enterキーを押す

注意:シミュレーターを含むパスに問題がないことを確認してください(パスで置き換えない場合)

#!/bin/sh
PS3='Type the number of your choice (1, 2 or 3) and press Enter: '
options=("List Devices" "Run Simulator" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "List Devices")
            xcrun simctl list devices
            echo "\033[1m\n\nCopy the UDID in parentheses of the device which you want run and launch option 2 (Run Simulator)\033[0m"
            ;;
        "Run Simulator")
            read -p 'Type device UDID which you want launch: ' currentDeviceUDID
            open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ --args -CurrentDeviceUDID $currentDeviceUDID
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

ありがとうございました、


0

これは2020、xCode 11.4です。ファイル->デバイスを開く-> iOs 13.4->で、最初に実行されていなかったiPhoneバージョンを選択すると、2番目のエミュレーターが実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.