Что делает опция командной строки mtouch --argument? - PullRequest
2 голосов
/ 02 марта 2012

Короткая версия:

Я заметил, что недавно обновленный mtouch (в настоящее время для меня 5.2.5) имеет несколько новых параметров командной строки - в частности, --launchdev, что меня очень радует,и --argument, который я не могу понять, как использовать.Что делает --argument?Могу ли я использовать его для передачи данных в приложение при запуске?Если да, то куда эти данные отправляются , и как мне их получить?


Более подробное объяснение того, что я делаю:

У меня есть автоматизированныйтестовая среда для наших библиотек MonoTouch.Для того чтобы он был действительно автоматизирован, мне нужно было иметь возможность: 1) автоматически запускать его на устройстве и 2) предоставлять ему IP-адрес сервера сборки, который запустил его, чтобы он знал, комупоговорим о том, когда он будет закончен.

В настоящее время я нашел единственный способ шунтировать данные в приложение iOS - через пользовательские схемы URL.По совпадению, это был также единственный способ, которым я должен был автоматически запускать приложение на устройстве, а не просто устанавливать его.Таким образом, мой сценарий сборки будет создавать тестовое приложение, устанавливать его, создавать сценарий для проекта Xcode с вызовом пользовательской схемы URL с данными, необходимыми тестовому приложению, и перечислять правильные заклинания AppleScript для запуска проекта Xcode на устройстве.Проект Xcode запустится и немедленно вызовет openUrl(...) с пользовательской схемой URL моего тестового приложения и необходимыми данными, что приведет к запуску тестового приложения, которое будет запускать его тесты, сообщать о результатах и ​​закрываться.

Iбыло бы чрезвычайно приятно, если бы с помощью некоторой комбинации --launchdev и --argument я мог бы вырезать большой кусок вышеуказанного безумия - особенно AppleScript, который очень хрупок и ненадежен.

Пока чтоЯ не понял, как использовать значения --argument в коде.Словарь launchOptions - это null с или без него, а args, которые передаются в Main, исчезают в недрах UIApplicationMain и никогда больше не слышат, насколько я могу судить - что не имеет значения в любом случаепотому что они всегда пусты.Итак, могу ли я использовать --argument для передачи данных?Если да, то как мне получить данные в приложении?

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

Это немного сложно и не задокументировано должным образом, но здесь это так:

--argument=ARG передаст ARG в качестве опции командной строки приложению при запуске (на устройстве или в симуляторе).MonoTouch создает собственный метод main для приложения, который обрабатывает ARG.И этот собственный метод main будет передавать любые аргументы, подобные этому: -app-arg:MANAGED_ARG управляемому методу Main.

Собрав все вместе, например, для передачи -ip=3.14.15.9 в ваше приложение на устройстве, вы выполните mtouchкак это:

mtouch --argument=-app-arg:-ip=3.14.15.9 --launchdev com.yourcompany.yourapp 

Обратите внимание, что собственный основной метод немного требователен к формату, он состоит из одной черты (-app-arg, а не --app-arg) и двоеточия перед MANAGED_ARG (не * 1013)*).

2 голосов
/ 02 марта 2012

Для других, которые пытаются это сделать, я хотел продемонстрировать, что именно я должен был сделать, чтобы использовать эти аргументы и в моем приложении.

Сначала укажите свой аргумент в командной строке, как сказал Рольф. За каждый --argument=-app-arg:SOMETHING, который вы вводите в командной строке, вы получите «НЕЧТО» в своем списке аргументов. Пример Рольфа,

mtouch --argument=-app-arg:-ip=3.14.15.9 --launchdev=com.yourcompany.yourapp

результаты и список аргументов { "-ip=3.14.15.9" }. Если бы я сделал что-то вроде этого

mtouch --argument=-app-arg:ARG1 --argument=-app-arg:ARG2=some_other_val --launchdev=com.yourcompany.yourapp

результирующий список аргументов { "ARG1", "ARG2=some_other_val" }. Не было ничего особенного в тире перед ip или знаком равенства после него. Просто убедитесь, что вы передаете его так, чтобы потом можно было разобрать. ;)

В вашем приложении вы можете получить к ним доступ либо в своем методе static void Main(string[] args), что может быть немного сложно, так как у вас еще нет AppDelegate или UIViewController, или вы можете вызвать Environment.GetCommandLineArgs() где угодно. Обратите внимание, что последний будет иметь фактический вызов вашего приложения в позиции 0, в то время как первый будет иметь только аргументы, а не вызов приложения.

Если вам нужно включить данные с пробелами, вы можете сделать это следующим образом:

mtouch --argument=-app-arg:"This data has spaces" --launchdev=com.yourcompany.yourapp

Ваш окончательный список аргументов будет { "This data has spaces" }. Без кавычек вы получите только { "This" }. Кроме того, помните, что подстановка параметров будет происходить с двойными кавычками, но не с одинарными кавычками:

SOMEVAR="value of SOMEVAR"
mtouch --argument=-app-arg:"SOMEVAR $SOMEVAR" --launchdev=com.yourcompany.yourapp
# Results in { "SOMEVAR value of SOMEVAR" }
mtouch --argument=-app-arg:'SOMEVAR $SOMEVAR' --launchdev=com.yourcompany.yourapp
# Results in { "SOMEVAR $SOMEVAR" }

Надеюсь, это поможет любому, кто пытался сделать то, что я есть, пока не появится больше официальной документации по опции --argument. Также обратите внимание, что если вы ссылаетесь на MonoTouch.NUnitLite, вы можете использовать Mono.Options.OptionSet для анализа аргументов за вас, если вы не хотите заново изобретать колесо.

1 голос
/ 02 марта 2012

Этот механизм используется в настоящее время для запуска наших приложений модульных тестов как на симуляторе, так и на устройствах.

Документация еще не , но обновлена, и функция может немного измениться до того, как она появится (все это очень недавно). Прямо сейчас вам лучше всего смотреть на Touch.Unit исходный код, в частности это commit от Rolf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...