I just looked at JetBrains's App Code IDE and it seems to be able to launch the iOS Simulator and run applications in it.
When I had to automate the deployment of my projects I had to resort to Applescript and GUI automation.
They seem to be using a closed tool called 'simlauncher'. I wonder what the magic behind it could be.
Update:
A little more info on the simulator from the output of '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
Now I suppose it's just a matter of sorting the commands according to the pid and executing them. :-)
There's a problem, though. All these binaries refer to dylibs present in the simulator platform's root. When I run them directly, they look for those in '/'.
Is there a way to set the path for dylibs before running a command? This looks promising: http://sacredsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile
https://github.com/BlueFrogGaming/icuke has good info too.
AppCode is available on macOS only since it cannot run without Xcode.
The Apple iOS Simulator, which ships as part of Xcode, is a tool for developing and prototyping your mobile app. While the iOS Simulator can be used to test your app's basic behaviour, it is severely limited as a testing platform.
Along the way, you'll get familiar with AppCode features and learn how to enable an interactive SwiftUI preview in AppCode using the InjectionIII application.
AppCode use a special wrapper to do this, that you noticed in its console :
/Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR>
simlauncher
is a non documented / not friendly mach-o binary... But here is a quick analysis of it:
To launch simulator it uses a private Apple framework (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)
This framework is bundled with Xcode:
<XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework
And is used like that (class-dump simlauncher
) (DTiPhoneSimulator*
are from 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
About the other binary AMDeviceService
I just can say it uses ProtocolBuffers in order I guess to communicate with MobileDevice
service... Once again, undocumented stuff...
Quick conclusion, sorry, there is no easy way to launch iPhoneSimulator using the JetBrains way, unless reversing Apple privates/not documented APIs... like Jetbrains folks did, I love their tools, they are top guns, can't wait appcode to be gold, already working on it everyday :)
EDIT: See answer below from a JetBrains employee... @JetBrains, would be great to have some sort of AMDeviceService
documented to automate some stuff... ;)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With