Содержание
Часто, нашим приложениям необходимо доступ в Сеть для совершения каких-либо операций. И прежде, чем выполнять какие-либо действия в Сети, нам необходимо убедиться, что устройство имеет доступ в Сеть. Проверка сетевых подключений в .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% гарантии того, что устройство действительно имеет полный доступ к Интернет.