Мне интересно, почему некоторые функции монотач хорошо работают в симуляторе, но не работают на реальном устройстве? тот же класс Ping. он отлично работает из симулятора, но не работает на устройстве. В чем разница? есть ли способ заставить его работать на устройстве?
можно ли будет портировать этот код на монотач? честно говоря, я еще не пробовал, работает ли это на iOS, но я ничего не вижу, почему бы это не работать там.
PS. Я знаю о классе Reachability, и да, я использую его в своих проектах вместо ping!
Скорее всего, это проблема с тем, что позволяет вам делать iOS.
Вот от одного парня, который пытался реализовать ping с использованием необработанных сокетов и столкнулся с ограничениями iOS.
Исходный отчет об ошибке гласит: "Для проверки связи требуется возможность ядра (capget) или бинарный файл ping на несуществующем устройстве". Другими словами: root-доступ.
Вот обходной путь, но это не реализация проверки связи.
Тем не менее, похоже, что кто-то успешно пытался перенести образец SimplePing на iOS, так что, возможно, в конце концов, это возможно, но это просто не было приоритетом для изучения этого (класс Reachability в конце концов доступен).
Просто добавьте этот репозиторий git в качестве подмодуля в свой проект, затем "Добавить существующий проект" и добавьте "MonoTouch.SimplePing" в свой проект. Существует один небольшой вспомогательный класс, который немного упростит работу в проекте "MonoTouch.SimplePing.Test" под названием "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", найденные в Интернете. Он пронизан ошибками с асинхронным кодом и проблемами с его работой на некоторых устройствах, а не на других. Вырвав себе волосы, я решил портировать этот проект SimplePing, так как обнаружил, что он действительно работает.
Наслаждаться!
Ответ 3 · рейтинг 1 · poupou
Мне интересно, почему некоторые функции монотач хорошо работают в симуляторе, но не работают на реальном устройстве?
MonoTouch запросит операционную систему, например. сетевой стек в этом случае, чтобы сделать его ставку. Операционная система может отличаться (и есть) между симулятором iOS и устройствами, а также вести себя по-разному во время выполнения.
В чем разница?
Просто чтобы еще раз подчеркнуть главный факт, что Apple SDK предоставляет симулятор iOS, который неэмулятор. Он даже не пытается эмулировать большинство ограничений устройств. Например. Это:
выполнять код x86, а не код ARM (как этого требует эмулятор Android);
позволяет выполнять JIT (что приятно, поскольку позволяет MonoTouch очень быстро строить для отладки в симуляторе). Это не разрешено (или даже возможно) на устройствах, и мы должны использовать компиляцию AOT;
предоставлять полный доступ к файловой системе (насколько может читать текущий пользователь);
не обеспечивает имитационную поддержку некоторых конкретных функций устройств (например, акселерометра);
список продолжается...
Некоторые различия велики (это намного быстрее, чем эмулятор, работающий с кодом ARM), в то время как другие могут быть довольно ограничивающими (например, отсутствие поддержки аппаратных функций) в определенных сценариях.