Connectivity

Browse sample. サンプルを参照する

この記事では、.NET マルチプラットフォーム アプリ UI (.NET MAUI) IConnectivity インターフェイスを使用して、デバイスのネットワーク アクセシビリティを検査する方法について説明します。 ネットワーク接続がインターネットにアクセスできる場合があります。 デバイスには、Bluetooth、携帯ネットワーク、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 - ローカルとインターネット アクセス。
  • ConstrainedInternet - 制限されたインターネット アクセス。 この値は、Web ポータルへのローカル アクセスが提供されるキャプティブ ポータルがあることを意味します。 ポータルを使用して認証資格情報を提供すると、インターネット アクセスが許可されます。
  • Local - ローカル ネットワーク アクセスのみ。
  • None - 使用できる接続がありません。
  • Unknown - インターネット接続を確認できません。

デバイスが実際に使用している接続プロファイルの種類を確認できます。

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 が報告される可能性がありますが、アクティブな接続は得られません。