18

JetBrains の App Code IDE を見たところ、iOS シミュレーターを起動してアプリケーションを実行できるようです。

プロジェクトの展開を自動化しなければならなかったとき、私は Applescript と GUI 自動化に頼らなければなりませんでした。

「simlauncher」と呼ばれるクローズド ツールを使用しているようです。その背後にある魔法は何なのだろうか。

アップデート:

  1. アクティビティ モニターを見ると、シミュレーターが起動する前に、simlauncher から osascript が起動されていることがわかります。それはまたApplescriptでしょうか?iOS Simulator.app はスクリプト化できないと思いました。
  2. iOS シミュレーターは launchd によって起動されるようです。そのため、simlauncher はそれ自体を起動するわけではありません。また、simlauncher は、実際のアプリケーションがシミュレーターで実行されるまでのみ残ります。彼らはおそらくそれをポーリングしていますか?
  3. デバイス ビルドでは、おそらく Apple Mobile Device Service のバージョンである AMDeviceService を使用しています。これは刑務所の壊れた SDK からのテクニックですか?

「ps」の出力からのシミュレーターに関するもう少しの情報:

plumenator 26404  12.9  1.3   290172  52772   ??  SX    8:56PM   0:03.62 /Users/plumenator/Library/Application Support/iPhone Simulator/4.3.2/Applications/817A280D-1F74-4755-B848-B04EC8A24ADA/xxx.app/xxx
plumenator 26395   2.3  0.3   444208  13560   ??  S     8:56PM   0:00.72 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator -SessionOnLaunch NO
plumenator 26402   1.4  0.8   318320  33052   ??  Us    8:56PM   0:00.86 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -SBDisableAutoDim YES -SBAutoLockTime -1 -SBAutoDimTime -1 -SBDontLockAfterCrash YES -SBDidShowReorderText YES -SBFakeBars YES -SBDontAnimateAppleDown YES -SBEnableDoubleHeightToggling YES
plumenator 26406   0.0  0.4  2466496  15792   ??  Ss    8:56PM   0:00.16 /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/libexec/gdb/gdb-i386-apple-darwin --arch i386 --interp=mi1 -q
plumenator 26401   0.0  0.1   106584   5688   ??  S     8:56PM   0:00.30 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/lsd
plumenator 26400   0.0  0.1   105228   4204   ??  S     8:56PM   0:00.13 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/installd -t 30
plumenator 26399   0.0  0.3   223488  11464   ??  Ss    8:56PM   0:00.15 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/SimulatorBridge 26395

これで、pid に従ってコマンドを並べ替えて実行するだけの問題になると思います。:-)

しかし、問題があります。これらのバイナリはすべて、シミュレータ プラットフォームのルートにある dylib を参照しています。それらを直接実行すると、「/」内のものを探します。

コマンドを実行する前に dylib のパスを設定する方法はありますか? これは有望に見えます: http://sacredsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile

https://github.com/BlueFrogGaming/icukeにも良い情報があります。

4

6 に答える 6

26

AppCode は特別なラッパーを使用してこれを行いますが、そのコンソールで気付きました:

/Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR>

simlauncher文書化されていない/友好的ではないマッハバイナリです...しかし、ここにそれの簡単な分析があります:

  • シミュレーターを起動するには、プライベート Apple フレームワーク ( otool -L simlauncher)を使用します。

    /Applications/AppCode-108.379.app/bin/simlauncher:
    @rpath/iPhoneSimulatorRemoteClient.framework/Versions/A/iPhoneSimulatorRemoteClient (compatibility version 1.0.0, current version 12.0.0)
    
  • このフレームワークは Xcode にバンドルされています。

    <XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework
    
  • そして、そのように使用されます ( class-dump simlauncher) ( DTiPhoneSimulator*Apple Framework からのものです):

    @protocol DTiPhoneSimulatorSessionDelegate
    - (void)session:(id)arg1 didEndWithError:(id)arg2;
    - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3;
    @end
    
    @interface Launcher : NSObject <DTiPhoneSimulatorSessionDelegate> {
        DTiPhoneSimulatorSession *mySession;
    }
    
    - (int)launch:(id)arg1 sdkVersion:(id)arg2 wait:(BOOL)arg3 device:(int)arg4 sout:(id)arg5 eout:(id)arg6 argument:(id)arg7 env:(id)arg8;
    - (void)session:(id)arg1 didEndWithError:(id)arg2;
    - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3;
    
    @end
    

他のバイナリについては、サービスと通信するためにProtocolBuffersAMDeviceServiceを使用していると言えます...もう一度、文書化されていないもの...MobileDevice

簡単な結論、申し訳ありませんが、JetBrains の方法を使用して iPhoneSimulator を起動する簡単な方法はありません.金になり、すでに毎日それに取り組んでいます:)

編集:JetBrainsの従業員からの以下の回答を参照してください... @JetBrains、AMDeviceServiceいくつかのものを自動化するために何らかの文書化するのは素晴らしいことです... ;)

于 2011-06-10T12:23:11.943 に答える
4

これがあなたの質問の内容であるかどうかは100%わかりませんが、ターミナルに次の行(すべて1行)を使用して、シミュレーターのデスクトップ(たとえば)にフォルダーがある任意のシミュレーターコンパイル済みアプリを実行できます。 、システムに適切な値を代入します):

/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone \ Simulator.app/Contents/MacOS/iPhone \ Simulator -SimulateApplication
/ Users / myusername / Desktop/[英数字のアプリディレクトリ名]/MyCompiledAppProject.app/MyCompiledAppProject

最後の「MyCompiledAppProject」ファイルは、.appで終わるパッケージ内にある実際のバイナリです(.appファイルをcontrolキーを押しながらクリックし、[パッケージの内容を表示]を選択して表示する必要があります)。シミュレータがまだ開いていない場合は、これによりシミュレータが起動します。新しくコンパイルされたアプリの場所をファイル引数として受け取り、Xcodeを開いたりxcodebuildを使用したりする必要がないAppleScriptに簡単にパッケージ化できます。

于 2011-06-10T12:16:21.010 に答える
4

iphonesimプロジェクトは、iOS アプリ用のコマンドライン ランチャーを提供します。私はそれがあなたが望むものをパッケージ化すると信じています.

于 2012-02-07T00:59:50.060 に答える
0

私はどこかで、彼らがこの種のことを彼らのために行うためにXcodeに依存していることを読んだと思います。しかし、それはあまり具体的ではなく、どこで読んだのかわかりません。シミュレーターを直接使用するのではなく、Xcodeをスクリプト化して起動およびデプロイしているのではないでしょうか。

于 2011-05-30T07:10:51.520 に答える
0

phone gap による同様のプロジェクトはhttps://github.com/phonegap/ios-simにあります。

于 2013-06-12T19:00:07.077 に答える