Разработка под Android в .NET MAUI. Проверка сетевых подключений

Часто, нашим приложениям необходимо доступ в Сеть для совершения каких-либо операций. И прежде, чем выполнять какие-либо действия в Сети, нам необходимо убедиться, что устройство имеет доступ в Сеть.  Проверка сетевых подключений в .NET MAUI осуществляется с использованием интерфейса IConnectivity.

Что важно знать при работе с IConnectivity

Несмотря на то, что рассмотренные ниже методы IConnectivity возвращают корректный результат, нет гарантии того, что ваше устройство имеет доступ в Интернет. Это не ошибка .NET MAUI. Просто возможен, например, такой вариант — устройство Android может быть подключено к сети Wi-Fi, но сам маршрутизатор отключен от Интернета. В этом случае мы получим информацию о том, что имеется доступ в Интернет, однако, по факту доступа нет. Поэтому, если вам необходимо 100% знать есть ли доступ к Интернет или нет, то лучше комбинировать работу IConnectivity с, например, проверкой доступности того же google.ru.

Интерфейс IConnectivity

Интерфейс IConnectivity предоставляет нам два свойства:

Свойство Тип Описание
ConnectionProfiles IEnumerable<ConnectionProfile> Возвращает активные типы подключения для устройства. Перечисление ConnectionProfile может принимать следующие значения:

  • Unknown неизвестный тип подключения.
  • Bluetooth подключение по Bluetooth.
  • Cellular подключение к мобильной сети.
  • Ethernet подключение по ethernet.
  • WiFi подключение к Wi-Fi.
NetworkAccess NetworkAccess Возвращает текущее состояние сетевого доступа. Перечисление NetworkAccess может принимать следующие значения:

  • Unknown состояние подключения неизвестно.
  • None подключение отсутствует.
  • Local доступ только к локальной сети.
  • ConstrainedInternet ограниченный доступ к Интернету.
  • Internet локальный и интернет-доступ.

а также одно событие:

Событие Тип Описание
ConnectivityChanged 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 мы будем выводить все активные профили сетевых подключений, а кнопка «Обновить» будет выполнять единственную команду в модели представления. Запустим приложение и проверим результат. Сразу после запуска приложения страница будет выглядеть следующим образом:

Проверка сетевых подключений .NET MAUI и C#

Теперь попробуйте, например, включить/отключить Wi-Fi на устройстве и вы увидите, что сработает событие, а на странице появится информация о подключении:

Проверка сетевых подключений .NET MAUI и C#Итого

Для проверки сетевых подключений устройства Android в .NET MAUI используется интерфейс IConnectivity реализация по умолчанию которого содержится в свойстве Current статического класса Connectivity. При использовании IConnectivity следует учитывать, что при проверке сетевых подключений нет 100% гарантии того, что устройство действительно имеет полный доступ к Интернет. 

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии