用单色平



我想知道为什么一些单触功能在模拟器中工作得很好,但在真实设备上失败?同一个Ping类。它可以在模拟器上完美地工作,但在设备上却失败了。有什么区别呢?有办法让它在设备上工作吗?

另外,我找到了一篇关于如何在mac OS中实现ping的文章:http://developer.apple.com/library/mac/samplecode/SimplePing/清单/SimplePing_m.html #//apple_ref/doc/uid/DTS10000716-SimplePing_m-DontLinkElementID_5

是否可以将此代码移植到monotouch?老实说,我还没有试过它是否适用于iOS,但我不知道为什么它不能在那里工作。

p。我知道可达性类,是的,我确实在我的项目中使用它而不是ping!

这很可能是iOS允许你做的一个问题。

这是一个试图使用原始套接字实现ping的家伙,遇到了iOS的限制。

最初的bug报告指出:"执行ping操作需要linux内核功能(capget)或设备上不存在的ping二进制文件。"也就是说:root权限。

这是一个解决方案,但它不是ping实现。

也就是说,看起来有人试图成功地将SimplePing样本移植到iOS上,所以也许这毕竟是可能的-但它只是没有被优先考虑(毕竟Reachability类是可用的)。

SimplePing for MonoTouch现在可以在这里使用

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

简单地将这个git repo作为子模块添加到您的项目中,然后"添加现有项目"并添加"MonoTouch"。对你的项目进行简化。在MonoTouch.SimplePing中有一个小的帮助类可以使事情变得简单一些。测试名为"SimplePingHelper"的项目

然后使用以下代码:

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"黑客。它充满了异步代码的bug,以及在某些设备上运行而在其他设备上运行的问题。在绞尽脑汁之后,我想我应该移植SimplePing项目,因为我发现它确实有效。

享受吧!

我想知道为什么一些单触功能在模拟器中工作得很好,但在真实设备上失败?

MonoTouch请求操作系统,例如本例中的网络堆栈,执行其命令。操作系统允许在iOS模拟器和设备之间有所不同,并且在运行时的行为也不同。

有什么区别?

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

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

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

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

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

  • 这样的例子不胜枚举……

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

最新更新