Форум программистов, компьютерный форум, киберфорум
Наши страницы

Xamarin

Войти
Регистрация
Восстановить пароль
 
Fortescue
0 / 0 / 1
Регистрация: 24.05.2017
Сообщений: 4
#1

Xamarin CrossConnectivity.Current.IsRemoteReachable не соединяется - Xamarin

28.12.2017, 12:49. Просмотров 217. Ответов 1

Доброе время суток. Есть кроссплатформенное решение Xamarin, установлен плагин Xam.Plugin.Connectivity. В проекте есть проверка на подключение к интернету и попытка соединиться с удалённым сервером. Так вот попытка всегда проваливается, будь то эмулятор или реальный девайс.

Сначала идёт проверка на подключение: CrossConnectivity.Current.IsConnected Возвращает true. Далее, проверяем подключение к удалённому серверу:

C#
1
2
3
4
    private static async Task<bool> ServerAvailable(string URL) {
        var server_available = await CrossConnectivity.Current.IsRemoteReachable(URL);
        return server_available;
    }
CrossConnectivity.Current.IsRemoteReachable всегда не может соединиться с пунктом назначения. В URL я передаю, например, http://yandex.ru или yandex.ru. Причём если запрос сделать не асинхронным и ждать выполнения, то на данном этапе приложение и застревает с концами. Вывод CrossConnectivity.Current.ConnectionTypes показывает только одно соединение - Cellular.

Android manifest выглядит вот так:

XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.MobileApp" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:label="MobileApp.Android"></application>
</manifest>
Проверял на: Android эмулятор 4.4 - 6.0, Android реальный девайс 5.1, Windows Phone эмулятор. Ситуация одинаковая.

Весь Интернет перерыл, все решения найденные поперепробовал, народ просто подключается и у них всё работает.

Подскажите пожалуйста, как решить проблему, в какую сторону копать?

IDE: MS Visual Studio Community 2015 v.14.0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2017, 12:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Xamarin CrossConnectivity.Current.IsRemoteReachable не соединяется (Xamarin):

Xamarin. Какой сайт открыт? - Mono
Здравствуйте. Подскажите как узнать какой открыт сайт на андроид. Уже два дня ищу решения и не нашёл. Заранее спасибо. Добавлено через...

Как создавать интерфейс в Xamarin.Android ? - Mono
Понадобилось написать приложение под Android, решил использовать .Net технологию, так как Java совсем не то. Проблема заключается вот...

Ошибка ADODB.Field error '800a0bcd' Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current recor - C# ASP.NET
Имею скрипт Set dbo = Server.CreateObject('ADODB.Connection') dbo.Open 'PEN1' Title = Request.QueryString('mess') SQLQuery =...

Голосовалка, ошибка: Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record. - C# ASP.NET
Вопросы по голосовалке с ответами, из базы вытаскиваются, при нажатии на ГОЛОСОВАТЬ результаты показываются, но на первые три ответа. В...

Ошибка Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record - Delphi БД
Большое спасибо всем кто хоть что-нибудь подскажет или наведёт на нужную мысль!! Короче проблема такая. ADOQuery1.Close; ...

ADODB.Field error '80020009' Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record. - C# ASP.NET
Выдается следующая ошибка : === ADODB.Field error '80020009' Either BOF or EOF is True, or the current record has been deleted....

1
Fortescue
0 / 0 / 1
Регистрация: 24.05.2017
Сообщений: 4
16.01.2018, 06:05  [ТС] #2
UPD: Решил вопрос. Xam.Plugin.Connectivity работает корректно и проверяющий соединение код тоже верный, не верным было применение этого кода, а именно вся проблема крылась в том, что я новичок в Xamarin и это порождало сразу 2 взаимоисключающие ситуации: 1. Запуск асинхронного метода из конструктора (там, где прописывается InitializeComponent() без ожидания выполнения, таким образом всегда получалось, что connection=false; 2. Запуск асинхронного метода из конструктора (там, где прописывается InitializeComponent() с ожиданием выполнения (Wait(), а сам конструктор конечно же не async), и таким образом получался дэдлок, о чём я и писал изначально.

Решение: Ожидать выполнения асинхронного метода (await), но ожидать можно только в соответствующих асинхронных методах (async). Конструктор приложения или страницы сделать асинхронным нельзя, но зато можно сделать таковыми специальные методы OnStart() - задействуется при запуске приложения и OnAppearing() - запускается при открытии страницы соответственно через override. Исходя из вышеизложенного, получаем следующий рабочий код:

Реализуем проверку в отдельном классе.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static class Connection
{
    public static async Task<bool> IsAvailable()
    {
        if (CrossConnectivity.Current.IsConnected)
        {
            var IsConnectionEnabled = await CrossConnectivity.Current.IsRemoteReachable("http://google.com");
 
            if (IsConnectionEnabled)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
}
Применяем статический метод на нужной странице или при запуске приложения.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected override async void OnAppearing()
    {
        base.OnAppearing();
 
        bool IsConnectionEnabled = await Connection.IsAvailable();
 
        if (IsConnectionEnabled)
        {
            await DisplayAlert("Connection Status", "Connection is OK", "OK");
        }
        else
        {
            await DisplayAlert("Connection Status", "Connection is BAD", "OK"); ;
        }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2018, 06:05
Привет! Вот еще темы с ответами:

Отличие Xamarin.Forms Xamarin.Native - Xamarin
Всем доброе время суток. Объясните пожлуйтса новичку в Xamarin правильно ли я понимаю, что Xamarin.Forms включает в себя Xamarin.Android...

Не соединяется с БД - PHP БД
Здравствуйте я уже час мучаюсь может я где то не правельно написал синтаксически можите подсказать как и что сделать результат ошибки прост...

Не соединяется - PHP БД
Здрасте! Не могу понять кое-что. Вот смотрите: У меня есть база данных NewBase, а в ней - таблица people. Я пытаюсь соединиться с БД...

Не соединяется БД - C#
Здравствуйте. В чем моя ошибка? Пытаюсь вывести одну из таблиц на форму. Использую этот код: using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.