Содержание
Часто, нашим приложениям необходимо доступ в Сеть для совершения каких-либо операций. И прежде, чем выполнять какие-либо действия в Сети, нам необходимо убедиться, что устройство имеет доступ в Сеть. Проверка сетевых подключений в .NET MAUI осуществляется с использованием интерфейса IConnectivity.
Что важно знать при работе с IConnectivity
Несмотря на то, что рассмотренные ниже методы IConnectivity возвращают корректный результат, нет гарантии того, что ваше устройство имеет доступ в Интернет. Это не ошибка .NET MAUI. Просто возможен, например, такой вариант — устройство Android может быть подключено к сети Wi-Fi, но сам маршрутизатор отключен от Интернета. В этом случае мы получим информацию о том, что имеется доступ в Интернет, однако, по факту доступа нет. Поэтому, если вам необходимо 100% знать есть ли доступ к Интернет или нет, то лучше комбинировать работу IConnectivity с, например, проверкой доступности того же google.ru.
Интерфейс IConnectivity
Интерфейс IConnectivity предоставляет нам два свойства:
| Свойство | Тип | Описание |
Connection |
IEnumerable<ConnectionProfile> |
Возвращает активные типы подключения для устройства. Перечисление ConnectionProfile может принимать следующие значения:
|
Network |
NetworkAccess |
Возвращает текущее состояние сетевого доступа. Перечисление NetworkAccess может принимать следующие значения:
|
а также одно событие:
| Событие | Тип | Описание |
Connectivity |
EventHandler<ConnectivityChangedEventArgs> |
Генерируется при изменении сетевого доступа или профиля. |
Реализация этого интерфейса доступна нам с использованием свойства Current статического класса Connectivity.
Проверка сетевых подключений в .NET MAUI
Определение необходимых разрешений
Для того, чтобы приложение .NET MAUI могло проверять статус сетевых подключений устройства, необходимо запросить разрешение android.permission.ACCESS_NETWORK_STATE. Сделать это можно любым из известных нам способов. Например, создадим новый проект .NET MAUI и используем атрибут сборки для определения разрешения:
using Android.App;
using Android.Runtime;
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]
namespace MauiConnect;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
Вывод информации о сетевых подключениях
Создадим в проекте новую папку ViewModels и разместим в ней следующий класс модели представления:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
namespace MauiConnect.ViewModels
{
public class ConnectivityViewModel : INotifyPropertyChanged
{
public ObservableCollection<string> Profiles { get; set; } = [];
private string networkAccess = "Нет подключения к Интернет";
public string NetworkAccess {
get => networkAccess;
set
{
if (networkAccess == value) return;
networkAccess = value;
OnPropertyChanged();
}}
public ICommand CheckCommand { get; set; }
public ConnectivityViewModel()
{
Connectivity.ConnectivityChanged += OnConnectivityChangedEvent;
CheckCommand = new Command(() =>
{
var profiles = Connectivity.Current.ConnectionProfiles;
var na = Connectivity.Current.NetworkAccess;
ConnectivityChangedEventArgs args = new(na, profiles);
OnConnectivityChangedEvent(this, args);
});
}
~ConnectivityViewModel()
{
Connectivity.ConnectivityChanged -= OnConnectivityChangedEvent;
}
private void OnConnectivityChangedEvent(object sender, ConnectivityChangedEventArgs args)
{
var profiles = args.ConnectionProfiles;
Profiles.Clear();
foreach (var profile in profiles)
{
switch (profile)
{
case ConnectionProfile.Unknown:
{
Profiles.Add("Неизвестный тип подключения");
break;
}
case ConnectionProfile.Bluetooth:
{
Profiles.Add("Bluetooth");
break;
}
case ConnectionProfile.Cellular:
{
Profiles.Add("Мобильная сеть");
break;
}
case ConnectionProfile.Ethernet:
{
Profiles.Add("Ethernet");
break;
}
case ConnectionProfile.WiFi:
{
Profiles.Add("Wi-Fi");
break;
}
}
}
switch (args.NetworkAccess)
{
case Microsoft.Maui.Networking.NetworkAccess.Unknown:
{
NetworkAccess = "Состояние подключения неизвестно";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.None:
{
NetworkAccess = "Подключение отсутствует";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.Local:
{
NetworkAccess = "Подключение только по локальной сети";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.ConstrainedInternet:
{
NetworkAccess = "Ограниченный доступ к Интернет";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.Internet:
{
NetworkAccess = "Доступ к Интернет и локальной сети";
break;
}
}
OnPropertyChanged(nameof(NetworkAccess));
}
public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
}
Здесь мы определили обработчик события:
private void OnConnectivityChangedEvent(object sender, ConnectivityChangedEventArgs args)
{
var profiles = args.ConnectionProfiles;
Profiles.Clear();
foreach (var profile in profiles)
{
switch (profile)
{
case ConnectionProfile.Unknown:
{
Profiles.Add("Неизвестный тип подключения");
break;
}
case ConnectionProfile.Bluetooth:
{
Profiles.Add("Bluetooth");
break;
}
case ConnectionProfile.Cellular:
{
Profiles.Add("Мобильная сеть");
break;
}
case ConnectionProfile.Ethernet:
{
Profiles.Add("Ethernet");
break;
}
case ConnectionProfile.WiFi:
{
Profiles.Add("Wi-Fi");
break;
}
}
}
switch (args.NetworkAccess)
{
case Microsoft.Maui.Networking.NetworkAccess.Unknown:
{
NetworkAccess = "Состояние подключения неизвестно";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.None:
{
NetworkAccess = "Подключение отсутствует";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.Local:
{
NetworkAccess = "Подключение только по локальной сети";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.ConstrainedInternet:
{
NetworkAccess = "Ограниченный доступ к Интернет";
break;
}
case Microsoft.Maui.Networking.NetworkAccess.Internet:
{
NetworkAccess = "Доступ к Интернет и локальной сети";
break;
}
}
OnPropertyChanged(nameof(NetworkAccess));
}
Который представляет свойства IConnectivity в виде обычных строк и назначили этот обработчик событию класс Connectivity:
Connectivity.ConnectivityChanged += OnConnectivityChangedEvent;
при этом, не забываем отписаться от события при уничтожении класса. Для этого мы определили деструктор:
~ConnectivityViewModel()
{
Connectivity.ConnectivityChanged -= OnConnectivityChangedEvent;
}
Команда CheckCommand считывает значения свойств Connectivity.Current.ConnectionProfiles и Connectivity.Current.NetworkAccess и передает их в метод OnConnectivityChangedEvent():
CheckCommand = new Command(() =>
{
var profiles = Connectivity.Current.ConnectionProfiles;
var na = Connectivity.Current.NetworkAccess;
ConnectivityChangedEventArgs args = new(na, profiles);
OnConnectivityChangedEvent(this, args);
});
Теперь нам остается использовать эту модель представления. Изменим код класса MainPage следующим образом:
using MauiConnect.ViewModels;
namespace MauiConnect
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
BindingContext = new ConnectivityViewModel();
}
}
}
а код XAML страницы сделаем следующим:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiConnect.MainPage"
xmlns:local="clr-namespace:MauiConnect.ViewModels"
x:DataType="local:ConnectivityViewModel">
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label Text="Активные профили сетевых подключений"/>
<CollectionView ItemsSource="{Binding Profiles}"/>
<Label Text="Доступ к Сети"/>
<Label Text="{Binding NetworkAccess}"/>
<Button Text="Обновить" Command="{Binding CheckCommand}"/>
</VerticalStackLayout>
</ScrollView>
</ContentPage>
В списке CollectionView мы будем выводить все активные профили сетевых подключений, а кнопка «Обновить» будет выполнять единственную команду в модели представления. Запустим приложение и проверим результат. Сразу после запуска приложения страница будет выглядеть следующим образом:
Теперь попробуйте, например, включить/отключить Wi-Fi на устройстве и вы увидите, что сработает событие, а на странице появится информация о подключении:
Итого
Для проверки сетевых подключений устройства Android в .NET MAUI используется интерфейс IConnectivity реализация по умолчанию которого содержится в свойстве Current статического класса Connectivity. При использовании IConnectivity следует учитывать, что при проверке сетевых подключений нет 100% гарантии того, что устройство действительно имеет полный доступ к Интернет.
