单声道触摸

时间:2011-12-02 04:16:25

标签: iphone ios xamarin.ios ping

我想知道为什么一些monotouch功能在模拟器中运行良好但在真实设备上失败? 同一个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!

3 个答案:

答案 0 :(得分:4)

这很可能是iOS允许您做的事情。

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

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

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

也就是说,看起来像somebody tried to port SimplePing示例到iOS成功,所以也许它毕竟是可能的 - 但它只是没有优先考虑它(Reachability类毕竟是可用)。

答案 1 :(得分:3)

现在可以使用MonoTouch的SimplePing。

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项目,因为我发现它确实有效。

享受!

答案 2 :(得分:1)

  

我想知道为什么一些monotouch功能在模拟器中运行良好但在真实设备上失败?

MonoTouch询问操作系统,例如:在这种情况下,网络堆栈,以进行其出价。允许操作系统在iOS模拟器和设备之间不同(并且),并且在运行时也表现不同。

  

有什么区别?

仅重新强制Apple SDK提供iOS 模拟器的主要事实是 模拟器。它甚至没有尝试模仿设备的大多数限制。例如。它:

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

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

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

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

  • 列表继续......

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