пинг в монотуш - PullRequest
       23

пинг в монотуш

1 голос
/ 02 декабря 2011

Мне интересно, почему некоторые функции monotouch хорошо работают в симуляторе, но не работают на реальном устройстве? тот же класс пинг. он отлично работает с симулятора, но не работает на устройстве. В чем разница? есть ли способ заставить его работать на устройстве?

Более того, я нашел эту статью о том, как реализовать ping в Mac OS: 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 ]

4 голосов
/ 02 декабря 2011

Скорее всего, это проблема того, что iOS позволяет вам делать.

Здесь от одного парня, который пытался реализовать ping с использованием необработанных сокетов и столкнулся с ограничениями iOS.

Исходный отчет об ошибке гласит: «Для выполнения ping требуется наличие ядра linux (capget) или двоичного файла ping на устройстве, которого не существует». Другими словами: root-доступ.

Здесь - это обходной путь, но это не реализация ping.

Тем не менее, похоже, кто-то попытался перенести образец SimplePing на iOS с успехом, так что, возможно, это все-таки возможно - но это просто не было приоритетом, чтобы изучить его ( Класс достижимости в конце концов доступен).

3 голосов
/ 30 октября 2013

SimplePing для MonoTouch теперь доступен здесь.

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

Просто добавьте это 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 ();
        }));
    });

ThisРешение работает в симуляторе и на каждом устройстве, которое я тестировал.

Не используйте хаки "RawSocket", найденные в Интернете.Он изобилует ошибками с асинхронным кодом и проблемами с ним, работающими на некоторых устройствах, а не на других.Выдернув свои волосы, я решил портировать этот проект SimplePing, поскольку обнаружил, что он действительно работает.

Наслаждайтесь!

1 голос
/ 02 декабря 2011

Мне интересно, почему некоторые функции monotouch хорошо работают в симуляторе, но не работают на реальном устройстве?

MonoTouch просит операционную систему, например, сетевой стек в этом случае, сделатьего торги.Операционная система может отличаться (и есть) между симулятором iOS и устройствами, а также вести себя по-разному во время выполнения.

В чем разница?

Просто дляподтвердите основной факт, что Apple SDK предоставляет симулятор iOS , который не и эмулятор .Он даже не пытается эмулировать большинство ограничений устройств.Например:

  • выполнить код x86, а не код ARM (как этого требует эмулятор Android);

  • позволяет использовать JIT (что являетсяприятно, так как это позволяет MonoTouch очень быстро строить для отладки под симулятором).Это недопустимо (или даже возможно) на устройствах, и мы должны использовать компиляцию AOT;

  • обеспечить полный доступ к файловой системе (столько, сколько текущий пользователь)может читать);

  • не обеспечивает имитацию поддержки некоторых функций определенных устройств (например, акселерометр);

  • список можно продолжить ...

Некоторые отличия велики (это намного быстрее, чем мог бы быть эмулятор, выполняющий код ARM), в то время как другие могут быть довольно ограничивающими (например, отсутствие поддержки дляаппаратные функции) в определенных сценариях.

...