Connectivity

Browse sample. 浏览示例

本文介绍如何使用 .NET Multi-platform App 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 清单:

    打开 Platforms/Android/AndroidManifest.xml 文件并在 manifest 节点中添加以下内容:

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

    - 或 -

  • 在清单编辑器中更新 Android 清单:

    在 Visual Studio 中,双击 Platforms/Android/AndroidManifest.xml 文件以打开 Android 清单编辑器。 然后,在所需权限下,选中ACCESS_NETWORK_STATE权限。 这样会自动更新 AndroidManifest.xml 文件。

使用 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();
    }
}

限制

请务必注意,Internet 可能由 NetworkAccess 报告,但对 Web 的完全访问权限不可用。 由于每个平台上的连接方式不同,因此只能保证连接可用。 例如,设备可能已连接到 Wi-Fi 网络,但路由器与 Internet 断开了连接。 在此示例中,可能会报告 Internet,但活动连接不可用。