我想知道为什么一些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!
答案 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代码的仿真器快得多),而其他情况则非常有限(例如,在某些情况下缺乏对硬件功能的支持)。