【问题标题】:What does the mtouch --argument command line option do?mtouch --argument 命令行选项有什么作用?
【发布时间】:2012-03-20 09:04:43
【问题描述】:

短版:

我注意到最近更新的mtouch(目前对我来说是 5.2.5)有一些新的命令行选项 - 特别是 --launchdev,这让我非常满意,还有--argument,我想不出来出来怎么用。 --argument 是做什么的?我可以在启动应用程序时使用它来将数据传递到应用程序吗?如果是这样,这些数据去到哪里,我如何获得它?


我在做什么的详细解释:

我有一个用于 MonoTouch 库的自动化测试环境。为了让它真正实现自动化,我需要能够 1) 在设备上自动启动它,以及 2) 向它提供首先启动它的构建服务器的 IP 地址,以便它知道该给谁完成时再谈。

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

如果通过--launchdev 和--argument 的某种组合,我可以消除上述疯狂的一大块——尤其是AppleScript,它非常脆弱和不可靠,我会非常高兴。

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

【问题讨论】:

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


    【解决方案1】:

    对于尝试这样做的其他人,我想确切地演示我必须做什么才能在我的应用程序中使用这些参数。

    首先,正如 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】:

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

      --argument=ARG 将在启动时(在设备上或在模拟器中)将 ARG 作为命令行选项传递给应用程序。 MonoTouch 为应用程序创建本机主方法,该方法用于处理 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 
      

      请注意,原生 main 方法对格式有点挑剔,它是一个破折号(-app-arg,而不是 --app-arg)和 MANAGED_ARG 之前的冒号(不是 =)。

      【讨论】:

        【解决方案3】:

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

        文档尚未更新,并且该功能可能会在更新之前发生一些变化(都是最新的)。现在最好的办法是查看 Touch.Unit 源代码,尤其是 Rolf 的 commit。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          • 2015-02-05
          • 2020-06-22
          • 2010-12-13
          • 2019-05-05
          相关资源
          最近更新 更多