Как JetBrains AppCode запускает iOS Simulator?

Я просто посмотрел на IDE JetBrains App Code и, похоже, смог запустить iOS Simulator и запустить приложения в нем.

Когда мне пришлось автоматизировать развертывание моих проектов, мне пришлось прибегать к автоматизации Applescript и GUI.

Кажется, что они используют закрытый инструмент под названием "simlauncher". Интересно, что это за магия.

Обновление:

  • При взгляде на Activity Monitor я вижу, что osascript запускается с simlauncher до запуска симулятора. Может ли это быть снова в Applescript? Я думал, что iOS Simulator.app не был доступен для сценариев.
  • iOS Simulator, похоже, запускается при запуске, поэтому simlauncher определенно не запускает его сам по себе. Кроме того, simlauncher остается только до тех пор, пока фактическое приложение не будет запущено в симуляторе. Они могут опросить его?
  • Для сборки устройств они используют AMDeviceService, что, вероятно, является версией службы Apple Mobile Device. Является ли это техникой из тюрьмы, разбитой 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 также имеет хорошую информацию.

Ответы

Ответ 1

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... Еще раз, недокументированные вещи...

Быстрое завершение, извините, нет простого способа запуска iPhoneSimulator с использованием метода JetBrains, если только реверсирование Apple не будет закрыто/не документировано API... например, люди Jetbrains, мне нравятся их инструменты, они являются топ-пушками, не могут подождите, пока appcode станет золотым, он будет работать на нем каждый день:)

EDIT: см. ответ ниже от сотрудника JetBrains... @JetBrains, было бы здорово иметь какой-то AMDeviceService, документированный для автоматизации некоторых вещей...;)

Ответ 2

Что именно вы хотите автоматизировать? Установка приложения и запуск его в симуляторе или устройстве?

О "3":

AMDeviceService - это всего лишь некоторый демон, который отвечает за любое взаимодействие с устройством. Он использует только библиотеку /System/Library/PrivateFrameworks/MobileDevice.framework(она закрыта). Он не знает о каких-либо материалах /Developer (конечно, если вы не собираетесь отлаживать устройство).

Эта служба развертывает приложение на устройстве, монтирует изображение разработчика, просматривает приложения на устройстве и запускает debugserver.

Он использует протокол протокола протоколов Google Protocol для связи с AppCode. Не Apple-материал.

Ответ 3

Не на 100% уверен, что это ваш вопрос, но я могу запустить произвольное приложение, скомпилированное с помощью Simulator, чью папку у меня на рабочем столе (например) в Simulator со следующей строкой в ​​терминале ( вся одна строка, подставляя соответствующие значения для вашей системы):

/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication 
/Users/myusername/Desktop/[the alphanumeric app directory name]/MyCompiledAppProject.app/MyCompiledAppProject

Где этот последний файл "MyCompiledAppProject" является фактическим двоичным файлом внутри пакета, который заканчивается на .app(вам нужно будет щелкнуть по файлу .app и щелкнуть "Показать содержимое пакета", чтобы увидеть его), Это запустит симулятор, если он еще не открыт. Он может быть легко упакован в AppleScript, который берет недавно скомпилированное местоположение приложения в качестве аргумента файла и не требует открытия Xcode или xcodebuild.

Ответ 4

Проект iphonesim дает вам запуск командной строки для приложений iOS. Я считаю, что он упаковывает то, что вам нужно.

Ответ 5

Я думаю, что я где-то читал, что они полагаются на Xcode, чтобы делать для них такую ​​вещь. Но это было не очень специфично, и я не знаю, где я его читал. Может быть, они запускают Xcode для запуска и развертывания вместо симулятора напрямую?