Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JetBrains AppCode如何启动iOS模拟器?_Ios_Automation_Simulator_Appcode - Fatal编程技术网

JetBrains AppCode如何启动iOS模拟器?

JetBrains AppCode如何启动iOS模拟器?,ios,automation,simulator,appcode,Ios,Automation,Simulator,Appcode,我刚刚看了JetBrains的应用程序代码IDE,它似乎能够启动iOS模拟器并在其中运行应用程序 当我不得不自动化项目的部署时,我不得不求助于Applescript和GUI自动化 他们似乎在使用一个叫做“simlauncher”的封闭工具。我想知道它背后的魔力是什么 更新: 在查看活动监视器时,我看到osascript在模拟器启动之前从simlauncher启动。它能再写一遍吗?我认为iOS Simulator.app无法编写脚本 iOS模拟器似乎是由launchd启动的,所以simlaunch

我刚刚看了JetBrains的应用程序代码IDE,它似乎能够启动iOS模拟器并在其中运行应用程序

当我不得不自动化项目的部署时,我不得不求助于Applescript和GUI自动化

他们似乎在使用一个叫做“simlauncher”的封闭工具。我想知道它背后的魔力是什么

更新:

  • 在查看活动监视器时,我看到osascript在模拟器启动之前从simlauncher启动。它能再写一遍吗?我认为iOS Simulator.app无法编写脚本
  • iOS模拟器似乎是由launchd启动的,所以simlauncher肯定不是自己启动的。此外,simlauncher仅在实际应用程序在模拟器中运行之前停留。也许他们在投票支持它
  • 对于设备构建,他们使用的是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。当我直接运行它们时,它们会在“/”中查找它们

    在运行命令之前,有没有办法设置dylibs的路径?这看起来很有希望:


    也有很好的信息。

    我想我在某个地方读到,他们依靠Xcode为他们做这类事情。但它不是很具体,我也不知道我在哪里读到的。也许他们正在编写Xcode脚本来启动和部署,而不是直接启动模拟器?

    不是100%确定这就是你的问题所在,但我能够运行任意模拟器编译的应用程序,我在模拟器的桌面上(例如)有一个文件夹,终端中有以下行(全部为一行,替换系统的适当值):

    /开发者/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\Simulator.app/Contents/MacOS/iPhone\Simulator-SimulateApplication /Users/myusername/Desktop/[字母数字应用程序目录名]/MyCompiledAppProject.app/MyCompiledAppProject
    其中最后一个“MyCompiledAppProject”文件是以.app结尾的包中的实际二进制文件(您必须控制.app文件并选择“显示包内容”以查看它)。如果模拟器尚未打开,这将启动模拟器。它可以很容易地打包在AppleScript中,以新编译的应用程序位置作为文件参数,并且不需要打开Xcode或使用xcodebuild。

    AppCode使用特殊的包装器来完成此操作,您在其控制台中注意到:

    /Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR>
    
  • 此框架与Xcode捆绑在一起:

    <XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework
    
  • 关于另一个二进制的
    AMDeviceService
    我只能说它使用的目的是为了与
    MobileDevice
    服务进行通信…再一次,未记录的东西

    很快得出结论,抱歉,使用JetBrains方式启动iPhoneSimulator并不容易,除非逆转Apple privates/not documented API…就像JetBrains的人一样,我喜欢他们的工具,他们是顶尖高手,迫不及待appcode成为黄金,已经每天都在开发:)


    编辑:请参阅JetBrains员工的以下回答@JetBrains,最好有一些
    AMDeviceService
    文档化的东西来自动化一些东西…;)

    您到底想要自动化什么?安装应用程序并在模拟器或设备中启动它

    关于“3”:

    AMDeviceService
    只是一个守护进程,负责与设备的任何交互。它只使用
    /System/Library/privateframes/MobileDevice
    .frameworklibrary(它是私有的)。它不知道任何
    /Developer
    东西(当然,如果您不打算在设备上调试的话)

    此服务在设备上部署应用程序、装载开发人员映像、在设备上浏览应用程序并启动debugserver


    它使用基于Google协议缓冲区的协议与AppCode通信。不是苹果的东西。

    该项目为iOS应用程序提供了一个命令行启动器。我相信它可以满足您的需要。

    类似的phone gap项目也在。

    他们只依赖于Xcode/Developer tools平台(用于Xcode构建),当然还有模拟器本身。他们没有启动Xcode,所以他们没有编写脚本。+1这太棒了。你是怎么发现的?从“ps”开始?但有一个问题。我无法选择版本、硬件等。回顾我的历史,我想我在搜索类似内容时看到了这个要点:。它实际上是从设置目标的xcodebuild调用开始的,不知道这是否有助于确定首选模拟器版本的目标。我猜可能不会,因为他们不太可能知道彼此。好吧,我只是尝试了几个论点,发现你可以在产品线的末尾添加-SimulatedDevice iPad,它将在iPad模拟器而不是iPhone模拟器中启动。我会看看SDK版本是否有类似的东西。哦,刚刚检查了你的链接,他们也已经找到了几个。你能用currentSDKRoot来定位这个版本吗?是的!例如,对于3.2,您必须指向/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk。顺便说一句,你是如何发现这个命令SimulatedDevice的?另一个限制是它不能启动SpringBoard。+1很棒的分析!我在哪里可以学习像这样的逆向工程?另外,从长远来看,AppCode依赖于此是否是一个好主意?苹果可以随时更改。谢谢:)只要在谷歌上搜索otool和classdump,你就会找到大量有用的资源。关于你的第二点,也许jetbrains与苹果合作,就像他们与微软合作一样。但这将是令人惊讶的。在任何情况下,都要确保至少有一个人在全职工作
    /Applications/AppCode-108.379.app/bin/simlauncher:
    @rpath/iPhoneSimulatorRemoteClient.framework/Versions/A/iPhoneSimulatorRemoteClient (compatibility version 1.0.0, current version 12.0.0)
    
    <XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.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