【问题标题】:ping in monotouch单点触控
【发布时间】:2013-10-30 06:10:04
【问题描述】:

我想知道为什么某些单点触控功能在模拟器中运行良好,但在真实设备上却失败了? 同Ping类。它在模拟器上完美运行,但在设备上失败。有什么区别?有办法让它在设备上运行吗?

此外,我发现这篇关于如何在 mac OS 中实现 ping 的文章: http://developer.apple.com/library/mac/#samplecode/SimplePing/Listings/SimplePing_m.html#//apple_ref/doc/uid/DTS10000716-SimplePing_m-DontLinkElementID_5

是否可以将此代码移植到 monotouch?老实说,我还没有尝试过它是否可以在 iOS 上运行,但我不明白为什么它不能在那里运行。

PS。我知道 Reachability 类,是的,我确实在我的项目中使用它而不是 ping!

【问题讨论】:

    标签: iphone ios xamarin.ios ping


    【解决方案1】:

    这很可能是 iOS 允许您执行的操作的问题。

    Here 来自一位尝试使用原始套接字实现 ping 并遇到 iOS 限制的人。

    The original bugreport 声明:“执行 ping 需要 linux 内核功能 (capget) 或设备上不存在的 ping 二进制文件。”换句话说:root 访问权限。

    Here 是一种解决方法,但它不是 ping 实现。

    也就是说,看起来somebody tried to port iOS 的 SimplePing 示例成功了,所以也许它毕竟是可能的 - 但它并不是优先考虑它(Reachability 类毕竟可用) .

    【讨论】:

      【解决方案2】:

      SimplePing for MonoTouch 现已推出。

      https://github.com/theonlylawislove/MonoTouch.SimplePing

      将此 git repo 作为子模块添加到您的项目中,然后“添加现有项目”并将“MonoTouch.SimplePing”添加到您的项目中。在名为“SimplePingHelper”的“MonoTouch.SimplePing.Test”项目中,有一个小的帮助程序类可以让事情变得更简单。

      然后使用下面的代码。

      SimplePingHelper.Ping (
          "192.168.5.77", 
          1000, 
          () => {
              NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => {
                  var alertView = new UIAlertView ("Response", "Success", null, null, new string[] { "Ok" });
                  alertView.Show ();
              }));
          }, 
          () => {
              NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => {
                  var alertView = new UIAlertView ("Response", "Failure", null, null, new string[] { "Ok" });
                  alertView.Show ();
              }));
          });
      

      此解决方案适用于模拟器和我测试过的每台设备。

      不要使用任何在互联网上发现的“RawSocket”黑客。它充满了异步代码的错误,以及它在某些设备上运行而不是在其他设备上运行的问题。拔掉头发后,我想我会移植那个 SimplePing 项目,因为我发现它确实有效。

      享受吧!

      【讨论】:

        【解决方案3】:

        我想知道为什么一些单点触控功能在模拟器上运行良好,但在真实设备上却失败了?

        MonoTouch 询问操作系统,例如在这种情况下,网络堆栈进行竞标。 iOS 模拟器和设备之间的操作系统允许不同(并且是),并且在运行时也有不同的行为。

        有什么区别?

        只是为了再次强调 Apple SDK 提供 iOS 模拟器这一主要事实不是模拟器。它甚至没有尝试模拟设备的大多数限制。例如。它:

        • 执行 x86 代码,而不是 ARM 代码(就像 Android 模拟器需要的那样);

        • 允许 JIT'ing(这很好,因为它允许 MonoTouch 在模拟器下快速构建以进行调试)。这在设备上是不允许的(甚至是不可能的),我们必须使用 AOT 编译;

        • 提供对文件系统的完全访问权限(当前用户可以读取的权限);

        • 不提供对某些特定设备功能(例如加速度计)的模拟支持;

        • 名单还在继续……

        其中一些差异很大(它比运行 ARM 代码的模拟器快得多),而另一些差异在某些情况下可能非常有限(例如,缺乏对硬件功能的支持)。

        【讨论】:

        • 好奇:你有没有想过在设备上使用 JIT 而不是 AOT 进行调试构建?它不会让每个人的生活更轻松吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多