Help us understand the problem. What is going on with this article?

iOSのネットワーク接続状態の検出にはReachabilityよりシンプルなNWPathMonitorを使いましょう。

iOSでネットワーク接続状態の取得といえばReachabilityを使うといった印象が強くありませんか。

Reachabilityを使うには、まず
https://developer.apple.com/library/archive/samplecode/Reachability/Introduction/Intro.html
からApple の提供しているサンプルコードをダウンロードして・・・なんて手間がありましたが、もっと手軽に利用できるApple標準のクラスがありました。

簡単にネットワーク接続のモニタリングが可能

NWPathMonitor

ネットワークの接続状態やネットワークインターフェースなどの情報をモニタリングできるNetwork frameworkのクラス。iOS 12.0以降から利用可能。
https://developer.apple.com/documentation/network/nwpathmonitor

実装ステップ

利用箇所でまずフレームワークをインポートしておきましょう。

import Network

モニタリング用クラスのインスタンス化

解放されるとコールバックが受け取れないので、ViewControllerのプロパティなどとして保持しておきましょう。

let monitor = NWPathMonitor()

requiredInterfaceType引数を指定して、ネットワークインターフェース別にモニタリングすることも可能です。

let wifiMonitor = NWPathMonitor(requiredInterfaceType: .wifi)

サポートしているインターフェースのタイプは以下に記載があります。
https://developer.apple.com/documentation/network/nwinterface/interfacetype

ネットワーク接続状態の変更をハンドリングする

monitor.pathUpdateHandler = { path in
    if path.status == .satisfied {
        // Connected
    }
}

後述しますが、モニタリングは通常バックグラウンドキューで指定して実行されます。
クロージャー内でUIを操作する場合には、メインスレッドで行うようにしましょう。

ネットワーク接続状態のモニタリングを開始する

モニタリングイベントを配信するためのDispatchQueueを定義して、モニタリングを開始します。

private let queue = DispatchQueue(label: "com.sample")
monitor.start(queue: queue)

ソースコード全体

import UIKit
import Network

final class ViewController: UIViewController {

    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "com.sample")

    override func viewDidLoad() {
        super.viewDidLoad()

        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                print("Connected")
            } else {
                print("Not Connected")
            }
        }

        monitor.start(queue: queue)
    }
}

まとめ

動画で載せたデモアプリの実装ですが、ViewController内を30行前後で書くことができました。
iOS12以降対応ですし、実用性もばっちりですね。
「ネットワーク接続状態の検出にはNWPathMonitor!」が定着すれば良いなと思います。

以上です :tada:
ありがとうございました。

meSummery
Wang-wang🐕🐩!
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away