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

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

28.12.2017, 12:49. Просмотров 384. Ответов 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
http://www.cyberforum.ru/xamarin/thread2111664.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2017, 12:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Xamarin CrossConnectivity.Current.IsRemoteReachable не соединяется (Xamarin):

FM or Xamarin
Не знал куда правильнее написать, если что перенесите Есть небольшой опыт...

Установка Xamarin
Добрый день! Уточните пожалуйста по установке. 1. Правильно я понимаю, на...

New Xamarin Studio
Кто-нибудь использовал новую Xamarin Studio для Android проектов какие...

Xamarin разработчик
Привет. Ищу разработчика знаюего Xamarin для разработки кросс...

Xamarin :: c# :: wmi
Всем привет. Нужна помощь с wmi. Как портировать код подключения к компу по...

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
есть проблема public FrameButton () { InitializeComponent (); ...

Разработчики Xamarin
Добрый день, есть идеи Старт-Ап (есть уже рабочие решения в Рунете). Нужен...

Xamarin Android
Подскажите где можно достать руководство по Xamarin, подробное описание...

Установка Xamarin
В двух словах, есть: 1) VS 2008 2) vstoolforxamarin.exe Подскажите, как...


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

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

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