mtouch --argument命令行选项有什么作用?

时间:2012-03-01 20:28:26

标签: c# .net ios xamarin.ios command-line-arguments

简短版本:

我注意到最近更新的mtouch(目前为5.​​2.5)有一些新的命令行选项 - 特别是--launchdev,这让我非常高兴,{{1} },我无法弄清楚如何使用。 --argument做了什么?我启动它时可以使用它将数据传递到应用程序吗?如果是这样,该数据去哪里,我该如何获得它?


对我正在做的事情有更长的解释:

我的MonoTouch库有一个自动化测试环境。为了使它真正实现自动化,我需要能够1)在设备上自动启动它,并且2)为它提供首先启动它的构建服务器的IP地址,这样它就知道了谈谈它何时完成。

目前,我发现将数据分流到iOS应用程序的唯一方法是通过自定义URL方案。巧合的是,这也是我必须自动在设备上启动应用程序的唯一方式,而不是简单地安装它。因此,我的构建脚本将构建测试应用程序,安装它,编写Xcode项目脚本,调用自定义URL方案和测试应用程序所需的数据,并背诵适当的AppleScript咒语以在设备上启动Xcode项目。 Xcode项目将启动,并立即使用我的测试应用程序的自定义URL方案和所需数据调用--argument,触发测试应用程序的启动,该应用程序将运行其测试,报告结果并关闭。

如果通过openUrl(...)--launchdev的某种组合,我可以减少上述疯狂的大部分 - 尤其是AppleScript,我会非常高兴,因为AppleScript非常脆弱且不可靠。 / p>

到目前为止,我还没有想到如何在代码中使用--argument的值。 --argument字典是launchOptions有或没有它,传入Main的null消失在UIApplicationMain的内容中,并且从未被再次听到过,据我所知 - 无论如何,因为它们总是空的。那么,我可以使用args传递数据吗?如果是这样,我如何在应用程序中检索数据?

3 个答案:

答案 0 :(得分:4)

这有点复杂,没有正确记录,但在这里:

--argument=ARG会在启动时(在设备上或模拟器中)将ARG作为命令行选项传递给应用程序。 MonoTouch为应用程序创建本机main方法,即处理ARG的方法。并且该本机main方法将这样的任何参数传递给托管的Main方法:-app-arg:MANAGED_ARG

将它们组合在一起,例如将-ip=3.14.15.9传递给设备上的应用程序,您将执行这样的mtouch:

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

请注意,本机main方法对格式有点挑剔,它是一个短划线(-app-arg,而不是--app-arg),以及在MANAGED_ARG(不是=)之前的冒号。

答案 1 :(得分:2)

对于其他试图这样做的人,我想要证明我在我的应用程序中使用这些参数时必须做些什么。

首先,在命令行中指定你的参数,正如Rolf所说。对于放在命令行中的每个--argument=-app-arg:SOMETHING,您将在参数列表中获得“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

您生成的arg列表将为{ "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为您进行参数解析。

答案 2 :(得分:1)

目前正在使用此机制在模拟器和设备上启动我们的单元测试应用程序。

文档尚未尚未更新,该功能可能会在它之前发生一些变化(这一切都是最新的)。现在你最好看的是Touch.Unit源代码,特别是Rolf的这个commit