Взаимодействие с сервером является одним из неотъемлемых возможностей многих мобильных приложений. Приложение может получать данные с сервера, или, наоборот, отправлять некоторые данные. Но чтобы взаимодействовать с сервером, необходимо подключение к сети, которое не не всегда может быть доступно в силу тех или иных причин. С помощью специального класса Connectivity из пакета Xamarin.Essentials, который добавляется в проект Xamarin Forms по умолчанию, мы можем проверить подключение к интернету.
Платформы имеют ряд ограничений при работе с сетью, которые нам надо учитывать. В частности, для получения состояния сети в Android, надо задать соответствующие разрешения. Для этого перейдем в проекте для Android к папке Properties, откроем файл AssemblyInfo.cs и добавим в него следующую строку:
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]
Либо также в проекте для Android и также в папке Properties мы можем добавить в файл AndroidManifest.xml в узел manifest строку:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Для проектов для iOS и UWP никаких изменений не требуется.
Какой функционал предоставляет класс Connectivity? Прежде всего с помощью свойства Connectivity.NetworkAccess он позволяет проверить наличие доступа к сети. Это свойство представляет перечисление NetworkAccess, которое определяет следующие значения:
Internet: есть подключение к интернету
ConstrainedInternet: есть ограниченный доступ, для которого требуются учетные данные
Local: имеется доступ только к локальной сети
None: доступ к сети отсутствует
Unknown: невозможно определить состояние подключения
Таким образом, с помощью данного перечисления мы можем проверить состояние подключения:
var current = Connectivity.NetworkAccess; if (current == NetworkAccess.Internet) { // некоторые действия }
Кроме того, класс Connectivity определяет свойство Connectivity.ConnectionProfiles, которое содержит набор доступых профилей для доступа к сети. Каждый профиль представлен перечислением ConnectionProfile, которое определяет следующие значения:
Bluetooth: есть доступ через Bluetooth
Cellular: подключение через мобильную связь
Ethernet: подключение через кабель Ethernet
WiFi: подключение через WiFi
Unknown: неизвестный тип подключения
Проверка типа подключения:
var profiles = Connectivity.ConnectionProfiles; if (profiles.Contains(ConnectionProfile.WiFi)) { // если активно подключение через Wi-Fi }
Кроме того, класс определяет событие Connectivity.ConnectivityChanged, которое генерируется при изменения состояния подключения.
Используем функционал класса Connectivity. Для этого в классе MainPage определим следующий код:
using System; using Xamarin.Forms; using Xamarin.Essentials; using System.Linq; namespace HelloApp { public partial class MainPage : ContentPage { Label connectionStateLbl; public MainPage() { connectionStateLbl = new Label { FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, }; Content = new StackLayout { Children = { connectionStateLbl} }; Connectivity.ConnectivityChanged += Current_ConnectivityChanged; } protected override void OnAppearing() { base.OnAppearing(); CheckConnection(); } // обработка изменения состояния подключения private void Current_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e) { CheckConnection(); } // получаем состояние подключения private void CheckConnection() { if(Connectivity.NetworkAccess == NetworkAccess.Internet) { connectionStateLbl.Text = "Доступные типы подключений:\n"; var profiles = Connectivity.ConnectionProfiles; foreach (var profile in profiles) { connectionStateLbl.Text += $"{profile.ToString()} \n"; } } else { connectionStateLbl.Text = "Подключение отсутствует"; } } } }
На странице определена метка, которая будет выводить информацию о подключении. Если полноценного подключения к интернету нет, выводим одно сообщение:
При наличии доступа к сети будут отображаться все доступные типы подключения: