18

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

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

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

更新:

  1. 在查看活动监视器时,我看到 osascript 在模拟器启动之前从 simlauncher 启动。会不会又是 Applescript?我认为 iOS Simulator.app 不可编写脚本。
  2. iOS Simulator 好像是用launchd 启动的,所以simlauncher 肯定不是自己启动的。此外,simlauncher 仅在实际应用程序在模拟器中运行之前一直存在。也许他们正在投票?
  3. 对于设备构建,他们使用 AMDeviceService,这可能是 Apple 移动设备服务的一个版本。这是来自越狱 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 的路径?这看起来很有希望: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是一个未记录/不友好的 mach-o 二进制文件......但这里是对它的快速分析:

  • 要启动模拟器,它使用私有 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
    

关于另一个二进制文件AMDeviceService,我只能说它使用ProtocolBuffers以便我猜想与MobileDevice服务通信......再一次,未记录的东西......

快速总结,抱歉,没有简单的方法来使用 JetBrains 方式启动 iPhoneSimulator,除非反转 Apple 私有/未记录的 API ......就像 Jetbrains 的人所做的那样,我喜欢他们的工具,他们是顶级枪手,等不及 appcode 了成为黄金,每天都在努力:)

编辑:请参阅下面来自 JetBrains 员工的回答...@JetBrains,如果有某种AMDeviceService文档来自动化某些东西会很棒... ;)

于 2011-06-10T12:23:11.943 回答
11

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

关于“3”:

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

该服务在设备上部署应用程序、挂载开发者映像、浏览设备上的应用程序并启动调试服务器。

它使用基于 Google Protocol Buffers 的协议与 AppCode 进行通信。不是苹果的东西。

于 2011-06-10T16:21:14.870 回答
4

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

/Developer/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。

于 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

电话间隙的类似项目位于https://github.com/phonegap/ios-sim

于 2013-06-12T19:00:07.077 回答