AppleのNetworkフレームワークは、ネットワークデータを扱うための便利なクラスを多数提供しており、その中にはネットワークのアクセス性を監視するために特別に設計されたクラスもあります。NWPathMonitorです。もしあなたがAppleの古いReachability
システムを使ったことがあるなら、NWPathMonitorはそれを完全に置き換える形となります。
重要: この記事を投稿したのが2020年3月26日(木)で自身の法人サイトの方でしたけれども、公式サイトの更新などでブログ系のメンテナンスが大変だったので、ここに過去の投稿の移動とこれからの記事を投稿をする予定です。
まず始めに、Networkフレームワークのインポートを追加します。
import Network
次に、すぐに解放されない場所にNWPathMonitorのインスタンスを作成します。例えば、ビューコントローラのプロパティとして持つ場合など
let monitor = NWPathMonitor()
次に、ネットワークアクセスが変更されたときにトリガーされるクロージャを、この監視に割り当てます。これは、現在可能なネットワークアクセスを記述したNWPathを1つのパラメータとして受け取る必要があります。
NWPathにはいくつかのプロパティがありますが、特に気になるのは次の2つでしょう。status
は現在接続可能かどうかを表し、isExpensive
は携帯電話データを使用する場合、またはiPhoneの携帯電話接続を経由してホットスポットされたWiFiを使用する場合にtrueに設定されます。
これを試すために、ユーザーの接続状態が変化したときにメッセージを表示し、さらにその接続が高価とみなされるか否かを表示するコードを以下に示します。
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("通信可能です!")
} else {
print("通信不可能です。")
}
print(path.isExpensive)
}
このクロージャは、接続状態が変わるたびに呼び出されることを覚えておいてください。
パス監視を作成し、設定したら、最後のステップとして、監視を実行するためのカスタム DispatchQueue インスタンスを作成し、その start() メソッドを呼び出します。
let queue = DispatchQueue(label: "Monitor")
monitor.start(queue: queue)
これが完了すると、接続状態が変わるたびにクロージャが呼び出されるので、そこにコードを追加して、アプリの残りの部分を現在の接続状態で更新することができます。
ネットワークチェックをより細かく制御したい場合は、特定のインターフェースタイプを使用してNWPathMonitorを作成することができます。例えば、特に携帯電話の通信状態をチェックしたい、携帯電話の通信状態だけをチェックしたい場合は、次のように記述します。
let cellMonitor = NWPathMonitor(requiredInterfaceType: .cellular)
.wifi
やwiredEthernet
を使用することも可能です。インターフェイスの種類を省略すると、それらすべてが同時に監視されるようになります。