NWPathMonitorはiOSおよびmacOSのNetworkフレームワークのクラスで、デバイスのネットワークパスの状態を監視します。Apple Developer Documentation (2025)によると、NWPathMonitorはアプリケーションがネットワークの可用性をトラックし、インターフェイスタイプを判別し、接続変化に対応することを可能にします。NWPathMonitorは、NWPathとの便利なコールバックを通じて、接続タイプ、データ費用、インターネットの可用性についての情報を提供します。
メインポイント
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フレームワークは、低レベルのC API — CFStreamおよびBSD Socketsの現代的な置き換えとして登場しました。watchOSやtvOSを含むすべてのAppleプラットフォームでネットワーク通信のための統一インターフェイスを提供します。NWPathMonitorはNWConnection、NWListener、NWBrowserと並んでこのフレームワークの一部です。
NetworkフレームワークはSwiftで書かれ、非同期処理にGCDを使用します。つまりNWPathMonitorのコールバックは指定されたdispatch queueで実行され、アプリケーションの既存のマルチスレッディングアーキテクチャに手動スレッド管理なしで統合されます。
NWPathMonitorの使用は、クラスのインスタンスを作成し、pathUpdateHandlerコールバックを設定することから始まります。その後、startメソッドをクロージャが実行されるdispatch queueとともに呼び出します。監視はcancelメソッドで停止され、これはリソースも解放します。
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はpathUpdateHandlerに渡されるオブジェクトで、ネットワークパスの現在の状態を記述します。これには、大半のネットワーク監視シナリオをカバーする5つの主なプロパティが含まれています。NWPath.Status — 3つの状態をもつエヌメレーション:satisfied(利用可能)、unsatisfied(利用不可)、requiresConnection(接続が必要)。
| プロパティ | タイプ | 説明 |
|---|---|---|
| status | NWPath.Status | 現在のパス状態: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | 利用可能なすべてのネットワークインターフェイスのリスト |
| gateways | [NWEndpoint] | ルーティングに使用されるゲートウェイのリスト |
| isExpensive | Bool | 接続がメーター制の場合はTrue(セルラーデータ、個人ホットスポット) |
| isConstrained | Bool | 接続が速度制限されている場合はTrue(Low Data Mode) |
isExpensiveプロパティは、大量のデータを扱うアプリにとって重要なフラグです。isExpensive = trueの場合、アプリはストリーミング品質を下げ、アップデートのダウンロードを延期し、またはユーザーに警告する必要があります。isConstrainedは、Low Data Modeが有効であることを示します。
インターネットの利用可能性(単なるネットワークではない)を確認するには、usesInterfaceTypeメソッドを使用します。デバイスがインターネットなしでWi-Fiに接続している場合 — NWPathはsatisfiedを示す可能性がありますが、実際のアクセスはありません。このような場合、NWConnectionを通じた追加の検証が必要です。
費用処理、インターフェイスタイプ、およびパブリッシャーを通じたViewModel通知を伴う高度なNWPathMonitor実装を見てみましょう。この例では、ネットワーク状態が変わったときの反応的なUI更新にCombineフレームワークを使用しています。
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以前、iOSでのネットワーク監視の標準的な解決策は、SystemConfiguration上に構築されたAppleのReachabilityライブラリ(ドキュメンテーションからの例)でした。主な違い:ReachabilityはCでSCNetworkReachabilityを通じて動作し、現代的なネットワークタイプをサポートせず、利用可能についての二進の応答だけを提供します。
NWPathMonitorはこれらの制限を解決します:Swiftで書かれ、VPN、multipath、5G、LTEをサポートし、各インターフェイスについての詳細な情報を提供し、GCDを通じて非同期的に動作します。Reachabilityは依然としてiOS 11以下をサポートするプロジェクトで使用されています。
| 特徴 | NWPathMonitor | Reachability |
|---|---|---|
| 最低バージョン | iOS 12 | iOS 2 |
| 言語 | Swift (Network) | C (SystemConfiguration) |
| インターフェイスタイプ | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN(一般) |
| isExpensive | あり | なし |
| 非同期 | GCD (dispatch queue) | RunLoop |
| 複数インターフェイス | あり (multipath) | なし |
アプリがiOS 11以下をサポートする場合、Reachabilityが唯一のオプションです。iOS 12+プロジェクトでは、NWPathMonitorを直接使用することを推奨します — 現代的なSwiftコード、Combine、SwiftUIとより良く統合できます。
ReachabilityからNWPathMonitorへの移行は簡単です:SCNetworkReachabilityのコールをNWPathMonitorに置き換えるだけで、同じ処理ロジックを保持できます。抽象レイヤー(NetworkMonitorProtocol)により、アプリのビジネスロジックを変えることなく実装を切り替えることができます。
よくある質問
NWPathMonitorはiOS 12.0、macOS 10.14、watchOS 5.0、tvOS 12.0以降で利用可能です。より古いバージョンをサポートするプロジェクトには、SystemConfigurationからのReachabilityか、#availableによる条件付きコンパイルを伴うラッパーライブラリを使用してください。
Satisfiedは、トラフィックが少なくとも1つのインターフェイスを通れることを意味します。Unsatisfied — 利用可能なインターフェイスがありません。requiresConnection状態 — パスが接続の確立を必要としており(例えばVPNが接続されていない)、トラフィックが一時的に通れません。
NWPathでusesInterfaceTypeメソッドを使用します:Wi-Fiの場合はpath.usesInterfaceType(.wifi)、セルラーデータの場合はpath.usesInterfaceType(.cellular)。現在のトラフィックが指定されたインターフェイスタイプを通る場合、このメソッドはtrueを返します。
バッテリー節約のため、バックグラウンドで監視を一時停止することを推奨します。applicationDidEnterBackgroundでmonitor.cancel()を呼び出し、applicationWillEnterForegroundでstartを再開すると、消費電力が削減されます。重要な操作にはBackground Taskを使用してください。
NWPathMonitorはキャプティブポータルでもsatisfiedを示す可能性があります。実際のインターネットアクセスを確認するには、NWConnectionを通じて信頼できるエンドポイントへのHTTPリクエストを実行します。リダイレクトが発生した場合 — ポータルがアクティブで、WebViewでの認証が必要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。