Форум программистов, компьютерный форум, киберфорум
Наши страницы
Xamarin
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Fortescue
0 / 0 / 1
Регистрация: 24.05.2017
Сообщений: 4
1

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

28.12.2017, 12:49. Просмотров 527. Ответов 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.Forms Xamarin.Native
Всем доброе время суток. Объясните пожлуйтса новичку в Xamarin правильно ли я понимаю, что...

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

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

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

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

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

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

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

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


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

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

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