Maui 网络

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://learn.microsoft.com/zh-cn/dotnet/maui/platform-integration/communication/networking?view=net-maui-7.0&tabs=ios

本文介绍如何使用 .NET 多平台应用 UI (.NET MAUI) IConnectivity 接口来检查设备的网络可访问性。 网络连接可能有权访问 Internet。 设备还包含不同类型的网络连接,例如蓝牙、手机网络或 WiFi。 接口 IConnectivity 具有监视设备连接状态更改的事件。

接口的默认实现 IConnectivity 可通过 Connectivity.Current 属性获得。 IConnectivity接口和 Connectivity 类都包含在 命名空间中Microsoft.Maui.Networking

入门

若要访问 Connectivity 该功能,需要以下特定于平台的设置。

需要具有 AccessNetworkState 权限,并且必须在 Android 项目中进行配置。 可以通过以下方法添加此权限:

  • 添加基于程序集的权限:

    打开 Platforms/Android/MainApplication.cs 文件,并在指令后面 using 添加以下程序集属性:

    [assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]
    

    - 或 -

  • 更新 Android 清单:

    打开 “平台/Android/AndroidManifest.xml ”文件,并在节点中添加 manifest 以下内容:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

使用 Connectivity

可以通过检查 NetworkAccess 属性来确定当前网络的范围。

NetworkAccess accessType = Connectivity.Current.NetworkAccess;

if (accessType == NetworkAccess.Internet)
{
    // Connection to internet is available
}

网络访问分为以下几类:

  • Internet — 本地和 Internet 访问。
  • ConstrainedInternet — Internet 访问受限。 此值表示存在一个强制门户,其中提供了对 Web 门户的本地访问权限。 使用门户提供身份验证凭据后,将授予 Internet 访问权限。
  • Local — 仅限本地网络访问。
  • None — 没有可用的连接。
  • Unknown — 无法确定 Internet 连接。

你可以检查设备当前正在使用哪种连接配置文件:

IEnumerable<ConnectionProfile> profiles = Connectivity.Current.ConnectionProfiles;

if (profiles.Contains(ConnectionProfile.WiFi))
{
    // Active Wi-Fi connection.
}

每当连接配置文件或网络访问发生更改时,将引发事件 ConnectivityChanged

public class ConnectivityTest
{
    public ConnectivityTest() =>
        Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;

    ~ConnectivityTest() =>
        Connectivity.ConnectivityChanged -= Connectivity_ConnectivityChanged;

    void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
    {
        if (e.NetworkAccess == NetworkAccess.ConstrainedInternet)
            Console.WriteLine("Internet access is available but is limited.");

        else if (e.NetworkAccess != NetworkAccess.Internet)
            Console.WriteLine("Internet access has been lost.");

        // Log each active connection
        Console.Write("Connections active: ");

        foreach (var item in e.ConnectionProfiles)
        {
            switch (item)
            {
                case ConnectionProfile.Bluetooth:
                    Console.Write("Bluetooth");
                    break;
                case ConnectionProfile.Cellular:
                    Console.Write("Cell");
                    break;
                case ConnectionProfile.Ethernet:
                    Console.Write("Ethernet");
                    break;
                case ConnectionProfile.WiFi:
                    Console.Write("WiFi");
                    break;
                default:
                    break;
            }
        }

        Console.WriteLine();
    }
}

限制

请务必知道,可能是报告了NetworkAccessInternet但对 Web 的完全访问权限不可用。 由于连接在每个平台上的工作方式,它只能保证连接可用。 例如,设备可能连接到Wi-Fi网络,但路由器与 Internet 断开连接。 在此实例 Internet 中,可能会报告活动连接不可用。