NWPathMonitor:ネットワーク監視とiOSでの動作

著者: IT Sectr 公開日: 2026-03-10 読了時間: 9 分

NWPathMonitorはiOSおよびmacOSのNetworkフレームワークのクラスで、デバイスのネットワークパスの状態を監視します。Apple Developer Documentation (2025)によると、NWPathMonitorはアプリケーションがネットワークの可用性をトラックし、インターフェイスタイプを判別し、接続変化に対応することを可能にします。NWPathMonitorは、NWPathとの便利なコールバックを通じて、接続タイプ、データ費用、インターネットの可用性についての情報を提供します。

メインポイント

  • NWPathMonitor — iOSおよびmacOSでの非同期ネットワークパス監視のためのNetworkフレームワークのクラス。
  • NWPathには、ネットワークの可用性、インターフェイスタイプ(Wi-Fi、セルラーデータ、Ethernet)および費用ステータスの情報が含まれています。
  • startメソッドは指定されたdispatch queueで監視を開始し、cancelメソッドで停止します。
  • pathUpdateHandlerプロパティ — ネットワークパス状態が変わるたびに呼ばれるクロージャ。
  • NWPathMonitorはrequiredInterfaceTypeパラメータを通じて必要なインターフェイスタイプによるフィルタリングをサポートしています。

NWPathMonitorとは?

NWPathMonitorは、AppleがiOS 12およびmacOS 10.14 Mojaveで導入したNetworkフレームワークのクラスです。デバイスのネットワークパスの変化をトラックするための現代的なAPIを提供します — アプリケーションのトラフィックが通るネットワークインターフェイスの組み合わせ。

iOS 12以前は、CベースのSystemConfigurationフレームワーク上に構築されたReachabilityライブラリがネットワーク監視に使用されていました。NWPathMonitorはより豊富なAPIを備えたネイティブなSwiftの代替品で、現代的な接続タイプ(VPN、multipath、LTE、5G)とビルトインGCDのサポートを提供します。

NWPathMonitorとReachabilityの主な違い — NWPathオブジェクトは「利用可能/不可能」という二進のステータスだけではなく、パスの完全な画像を提供します:使用されるインターフェイス、その優先度、費用、ローミング状態、およびプロキシとVPNの機能。開発者はネットワークリクエストについての判断を下すための包括的な情報を得られます。

Networkフレームワークの歴史

Networkフレームワークは、低レベルのC API — CFStreamおよびBSD Socketsの現代的な置き換えとして登場しました。watchOSやtvOSを含むすべてのAppleプラットフォームでネットワーク通信のための統一インターフェイスを提供します。NWPathMonitorはNWConnection、NWListener、NWBrowserと並んでこのフレームワークの一部です。

NetworkフレームワークはSwiftで書かれ、非同期処理にGCDを使用します。つまりNWPathMonitorのコールバックは指定されたdispatch queueで実行され、アプリケーションの既存のマルチスレッディングアーキテクチャに手動スレッド管理なしで統合されます。

アプリケーションでのNWPathMonitorの使い方

NWPathMonitorの使用は、クラスのインスタンスを作成し、pathUpdateHandlerコールバックを設定することから始まります。その後、startメソッドをクロージャが実行されるdispatch queueとともに呼び出します。監視はcancelメソッドで停止され、これはリソースも解放します。

swift
import Network

class NetworkMonitor {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("monitor")

    func startMonitoring() {
        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                print("ネットワーク利用可能")
            } else {
                print("ネットワーク利用不可")
            }
        }
        monitor.start(on: queue)
    }

    func stopMonitoring() {
        monitor.cancel()
    }
}

インターフェイスタイプの取り扱い

NWPathMonitorは、特定のインターフェイスタイプのみを監視するように設定できます。イニシャライザNWPathMonitor(requiredInterfaceType:)をNWInterface.InterfaceTypeパラメータ — .wifi、.cellular、.wiredEthernetまたは.loopbackとともに使用します。タイプが指定されない場合、監視はすべてのインターフェイスをカバーします。

実用例:ストリーミングアプリはWi-Fiのみを監視し、セルラーデータへの切り替えについてユーザーに警告できます。NWPathでisConstrainedとisExpensiveをチェックすると、現在の接続がメーター制であるか、高速制限があるかを判別できます。

監視のライフサイクル

監視はアプリ起動時またはフォアグラウンド入力時に開始し、バックグラウンド入力時に停止する必要があります。アプリ全体で1つのNWPathMonitorインスタンス(シングルトン)を作成し、プロトコルまたはサービスレイヤーを通じて異なるモジュールから使用することを推奨します。

NWPathのプロパティと機能

NWPathはpathUpdateHandlerに渡されるオブジェクトで、ネットワークパスの現在の状態を記述します。これには、大半のネットワーク監視シナリオをカバーする5つの主なプロパティが含まれています。NWPath.Status — 3つの状態をもつエヌメレーション:satisfied(利用可能)、unsatisfied(利用不可)、requiresConnection(接続が必要)。

プロパティタイプ説明
statusNWPath.Status現在のパス状態: satisfied, unsatisfied, requiresConnection
availableInterfaces[NWInterface]利用可能なすべてのネットワークインターフェイスのリスト
gateways[NWEndpoint]ルーティングに使用されるゲートウェイのリスト
isExpensiveBool接続がメーター制の場合はTrue(セルラーデータ、個人ホットスポット)
isConstrainedBool接続が速度制限されている場合はTrue(Low Data Mode)

費用と制限のチェック

isExpensiveプロパティは、大量のデータを扱うアプリにとって重要なフラグです。isExpensive = trueの場合、アプリはストリーミング品質を下げ、アップデートのダウンロードを延期し、またはユーザーに警告する必要があります。isConstrainedは、Low Data Modeが有効であることを示します。

インターネットの利用可能性(単なるネットワークではない)を確認するには、usesInterfaceTypeメソッドを使用します。デバイスがインターネットなしでWi-Fiに接続している場合 — NWPathはsatisfiedを示す可能性がありますが、実際のアクセスはありません。このような場合、NWConnectionを通じた追加の検証が必要です。

NWPathMonitorの実装例

費用処理、インターフェイスタイプ、およびパブリッシャーを通じたViewModel通知を伴う高度なNWPathMonitor実装を見てみましょう。この例では、ネットワーク状態が変わったときの反応的なUI更新にCombineフレームワークを使用しています。

swift
import Network
import Combine

final class NetworkManager: ObservableObject {
    static let shared = NetworkManager()
    @Published private(set) var isConnected = true
    @Published private(set) var isExpensive = false

    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("NetworkMonitor")

    private init() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                self?.isConnected = path.status == .satisfied
                self?.isExpensive = path.isExpensive
            }
        }
        monitor.start(on: queue)
    }

    func checkInterface() -> NWInterface.InterfaceType {
        let path = monitor.currentPath
        if path.usesInterfaceType(.wifi) { return .wifi }
        if path.usesInterfaceType(.cellular) { return .cellular }
        return .other
    }
}

遅延アクションでのネットワーク失の処理

接続が切れたときは、UIに通知するだけでなく、遅延アクションを実行する必要がある場合があります — 例えば、後で送信するためのリクエストの下書きを保存するなど。unsatisfiedステータス中に操作を蓄積し、satisfiedが回復されたときに送信する遅延リクエストのキューを実装してください。

このタスクにはデリゲート付きReachabilityManagerパターンが理想的です:NWPathMonitorがマネージャーに通知し、マネージャーがキューとUIを更新します。状態がsatisfiedに変わると、キューは自動的にフラッシュされ、UIは接続回復の表示を受け取ります。

NWPathMonitor vs Reachability

NWPathMonitor以前、iOSでのネットワーク監視の標準的な解決策は、SystemConfiguration上に構築されたAppleのReachabilityライブラリ(ドキュメンテーションからの例)でした。主な違い:ReachabilityはCでSCNetworkReachabilityを通じて動作し、現代的なネットワークタイプをサポートせず、利用可能についての二進の応答だけを提供します。

NWPathMonitorはこれらの制限を解決します:Swiftで書かれ、VPN、multipath、5G、LTEをサポートし、各インターフェイスについての詳細な情報を提供し、GCDを通じて非同期的に動作します。Reachabilityは依然としてiOS 11以下をサポートするプロジェクトで使用されています。

特徴NWPathMonitorReachability
最低バージョンiOS 12iOS 2
言語Swift (Network)C (SystemConfiguration)
インターフェイスタイプWi-Fi, Cellular, Ethernet, VPNWi-Fi, WWAN(一般)
isExpensiveありなし
非同期GCD (dispatch queue)RunLoop
複数インターフェイスあり (multipath)なし

Reachabilityを使用すべき場合

アプリがiOS 11以下をサポートする場合、Reachabilityが唯一のオプションです。iOS 12+プロジェクトでは、NWPathMonitorを直接使用することを推奨します — 現代的なSwiftコード、Combine、SwiftUIとより良く統合できます。

ReachabilityからNWPathMonitorへの移行は簡単です:SCNetworkReachabilityのコールをNWPathMonitorに置き換えるだけで、同じ処理ロジックを保持できます。抽象レイヤー(NetworkMonitorProtocol)により、アプリのビジネスロジックを変えることなく実装を切り替えることができます。

よくある質問

NWPathMonitorに必要な最低のiOSバージョンは?

NWPathMonitorはiOS 12.0、macOS 10.14、watchOS 5.0、tvOS 12.0以降で利用可能です。より古いバージョンをサポートするプロジェクトには、SystemConfigurationからのReachabilityか、#availableによる条件付きコンパイルを伴うラッパーライブラリを使用してください。

NWPath.Status.satisfiedとunsatisfiedの違いは?

Satisfiedは、トラフィックが少なくとも1つのインターフェイスを通れることを意味します。Unsatisfied — 利用可能なインターフェイスがありません。requiresConnection状態 — パスが接続の確立を必要としており(例えばVPNが接続されていない)、トラフィックが一時的に通れません。

ネットワークタイプ(Wi-Fiまたはセルラー)を判別する方法は?

NWPathでusesInterfaceTypeメソッドを使用します:Wi-Fiの場合はpath.usesInterfaceType(.wifi)、セルラーデータの場合はpath.usesInterfaceType(.cellular)。現在のトラフィックが指定されたインターフェイスタイプを通る場合、このメソッドはtrueを返します。

バックグラウンド入力時にNWPathMonitorをキャンセルすべきか?

バッテリー節約のため、バックグラウンドで監視を一時停止することを推奨します。applicationDidEnterBackgroundでmonitor.cancel()を呼び出し、applicationWillEnterForegroundでstartを再開すると、消費電力が削減されます。重要な操作にはBackground Taskを使用してください。

NWPathMonitorでキャプティブポータルを処理する方法は?

NWPathMonitorはキャプティブポータルでもsatisfiedを示す可能性があります。実際のインターネットアクセスを確認するには、NWConnectionを通じて信頼できるエンドポイントへのHTTPリクエストを実行します。リダイレクトが発生した場合 — ポータルがアクティブで、WebViewでの認証が必要です。

まとめ

  • NWPathMonitor — GCDおよびCombineサポート付きでiOS 12+のネットワークパスを監視するNetworkフレームワークのクラス。
  • NWPathには接続についての完全な情報(状態、インターフェイスタイプ、費用、制限、ゲートウェイ)が含まれています。
  • startメソッドは指定されたキューで監視を開始し、pathUpdateHandlerはNWPathの更新を受け取ります。
  • isExpensiveとisConstrainedプロパティは、メーター制および制限付きの接続を識別できます。
  • NWPathMonitorはiOS 12+でReachabilityに代わり、より豊富なSwift APIを提供します。
  • インターフェイスタイプによるフィルタリングは、requiredInterfaceTypeパラメータを持つイニシャライザで実装されます。
  • バックグラウンド動作の場合、foregroundとbackgroundの切り替え時に監視を一時停止および再開する必要があります。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください