Reachability: ネットワーク可用性確認ライブラリ

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

Reachabilityは、SystemConfigurationフレームワーク上に構築されたiOSおよびmacOS用のライブラリで、インターネット接続の可用性を確認し、その変更を追跡できます。Apple Developerドキュメント(2025)によると、Reachabilityは非同期ネットワーク監視にSCNetworkReachabilityを使用しています。Reachabilityライブラリは、ネイティブのNWPathMonitorが登場するまで、長い間iOSプロジェクトの標準でした。

重要なポイント

  • Reachability — iOSおよびmacOSでネットワーク可用性を監視するためのCフレームワークSystemConfigurationのラッパーです。
  • SCNetworkReachability — リモートホストまたはアドレスの到達可能性を確認する低レベルのC APIです。
  • 接続タイプ — Reachabilityはアプリケーションの動作を適応させるためにWi-Fiとセルラーデータ(WWAN)を区別します。
  • 通知 — SCNetworkReachabilitySetCallbackを介して、ライブラリはRunLoopを使用してネットワーク変更にサブスクライブします。
  • NWPathMonitor — Reachabilityの最新の代替であり、iOS 12以降で利用可能でAppleが推奨しています。

Reachabilityとは

Reachabilityは、ネットワーク監視にSystemConfigurationフレームワークを使用することを示すAppleのサンプルライブラリです。ソースコードはApple Developerドキュメントに例として公開されましたが、コミュニティはそれをiOSプロジェクトでの接続確認の標準ツールとして採用しました。

このライブラリはSCNetworkReachability — SystemConfigurationのC関数で、リモートホストまたはIPアドレスの到達可能性を評価します — に基づいています。Reachabilityを作成する際、ホスト名(例:google.com)またはIPアドレスを指定し、ライブラリは非同期でこのホストがデバイスの現在のネットワークインターフェースを介して到達可能かどうかを確認します。

Reachabilityの人気はそのシンプルさにあります:インスタンスを作成し、NotificationCenterを介して通知にサブスクライブし、kReachabilityChangedNotificationをリッスンするだけです。応答として、アプリはNotReachable、ReachableViaWiFi、またはReachableViaWWAN(セルラーデータ)のステータスを受け取ります。

ライブラリの歴史とステータス

ReachabilityはiPhone OS 2(2008)でSystemConfigurationフレームワークとともに初めて登場しました。10年にわたって、iOSでネットワークステータスを監視する唯一のネイティブな方法でした。iOS 12とNetworkフレームワークのリリースに伴い、AppleはNWPathMonitorを代替として推奨していますが、Reachabilityはまだサポートされています。

多くのサードパーティラッパー — AFNetworking、Alamofire、AshleyDodd/Reachability.swift — は内部のSCNetworkReachabilityメカニズムを使用しています。これらのライブラリは便利なSwift/Objective-Cインターフェース、ステータスのメモ化、スレッドセーフなコールバックを追加し、同じSystemConfiguration基盤を維持しています。

Reachabilityの内部動作

Reachabilityの主要なメカニズムはSCNetworkReachabilityCreateWithName関数で、指定されたホストの追跡オブジェクトを作成します。次にSCNetworkReachabilityGetFlagsが呼び出されます — 現在のネットワーク状態でSCNetworkReachabilityFlagsのビットマスクを返す同期チェックです。

非同期監視にはSCNetworkReachabilitySetCallbackが使用され、Cコールバック関数を登録します。ホストの到達可能性状態が変わると、コールバックは現在のRunLoopで実行されます。ReachabilityはこのCコールバックをObjective-Cメソッドにラップし、NotificationCenterを介して通知を送信します。

swift
import SystemConfiguration

class Reachability {
    private var reachabilityRef: SCNetworkReachability?

    init?(hostname: String) {
        reachabilityRef = SCNetworkReachabilityCreateWithName(
            nil, hostname
        )
    }

    func checkReachability() -> Bool {
        var flags = SCNetworkReachabilityFlags()
        SCNetworkReachabilityGetFlags(
            reachabilityRef!, &flags
        )
        return isReachable(with: flags)
    }

    private func isReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
        let reachable = flags.contains(.reachable)
        let connectionRequired = flags.contains(.connectionRequired)
        return reachable && !connectionRequired
    }
}

ネットワーク到達可能性フラグ

SCNetworkReachabilityFlagsはネットワーク状態をエンコードするビットマスクです。kSCNetworkReachabilityFlagsReachableフラグはホストが到達可能であることを示します。kSCNetworkReachabilityFlagsConnectionRequired — 接続の確立が必要です。フラグの組み合わせによってアプリケーションがデータを送信できるかどうかが決まります。

追加フラグ:kSCNetworkReachabilityFlagsIsWWAN — セルラーネットワーク(iOS)を介した接続、kSCNetworkReachabilityFlagsInterventionRequired — ユーザーの介入が必要(例:VPN用)。Reachabilityはこれらのフラグを考慮してインターフェースタイプを決定します。

Reachabilityの使用例

iOSアプリでのReachabilityの標準的な使用パターンは、インスタンスの作成、通知へのサブスクライブ、ステータス変更への対応を含みます。以下の例は、ネットワーク変更時にUIを更新するためのNotificationCenterとの統合を示しています。

swift
import Reachability
import UIKit

class ViewController: UIViewController {
    var reachability: Reachability?

    override func viewDidLoad() {
        super.viewDidLoad()
        reachability = Reachability(hostname: "google.com")
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(reachabilityChanged),
            name: .reachabilityChanged,
            object: nil
        )
        reachability?.startNotifier()
    }

    @objc func reachabilityChanged(notification: Notification) {
        if let reachability = notification.object as? Reachability {
            switch reachability.connection {
            case .wifi:
                print("Wi-Fiに接続済み")
            case .cellular:
                print("セルラーに接続済み")
            case .unavailable:
                print("接続なし")
            }
        }
    }
}

リクエスト前のネットワーク確認

HTTPリクエストを実行する前に、ネットワークの可用性を同期的に確認できます:reachability.connection != .unavailable。これはリクエストの成功を保証するものではありませんが(サーバーが利用不可の場合があります)、明らかに失敗するリクエストを防ぎ、UXを向上させます — アプリはオフラインモードでスピナーを表示しません。

より正確な確認には、ReachabilityをURLSessionタイムアウトと組み合わせてください。Reachabilityが到達可能と表示してもリクエストがタイムアウト内に失敗する場合 — サーバー側の問題またはキャプティブポータルの可能性があります。その場合、サーバー利用不可のメッセージをユーザーに表示できます。

Reachabilityの接続タイプ

Reachabilityは3つの主要な接続状態を区別します:Wi-Fi、セルラーデータ(WWAN)、利用不可。WWANにはすべてのセルラー接続タイプ — 2G、3G、4G/LTE、5G — が含まれます。ライブラリはWWAN内の詳細を提供しないため、4Gと5Gを区別するにはCoreTelephonyが必要です。

状態SCNetworkフラグ説明
ReachableViaWiFiReachable + !IsWWANホストアクセス可能なWi-Fiネットワークを介した接続
ReachableViaWWANReachable + IsWWANセルラーネットワーク(2G-5G)を介した接続
NotReachable!Reachableどのインターフェースを介してもホストに到達不可
ConnectionRequiredReachable + ConnectionRequired接続確立が必要(VPN、PPPoE)

ネットワークタイプ別のReachabilityの制限

ReachabilityはEthernet、VPNトンネル、マルチパス接続を区別しません — すべての非WWANインターフェースはWi-Fiとして分類されます。この制限は、基本的な分類を超えたネットワークインターフェースに関する詳細情報を提供しないSystemConfigurationのアーキテクチャに起因します。

特定のセルラー接続タイプ(4G vs 5G)を判断するには、CoreTelephonyのCTTelephonyNetworkInfoが必要です。ReachabilityをCoreTelephonyと組み合わせることで、アプリはコンテンツ品質を選択できます:5Gでは4Kストリーミング、4G/LTEではHD、3GではSDまたは音声のみ。

ReachabilityからNWPathMonitorへの移行

AppleはiOS 12以降のすべての新規プロジェクトでReachabilityをNWPathMonitorに置き換えることを推奨しています。主な理由は、NWPathMonitorが最新のNetworkフレームワークの一部であり、Swiftで書かれ、Combineをサポートし、C互換性なしで詳細なネットワークパス情報を提供することです。

移行プロセスには、SCNetworkReachabilityをNWPathMonitorに置き換え、NotificationCenterからpathUpdateHandlerクロージャまたはCombineパブリッシャーに切り替えることが含まれます。ネットワークステータス処理のアルゴリズムとロジックは同じままです — 監視APIのみが変更されます。

swift
protocol NetworkMonitorProtocol {
    var isReachable: Bool { get }
    var connectionType: ConnectionType { get }
    func startMonitoring()
    func stopMonitoring()
}

enum ConnectionType {
    case wifi, cellular, ethernet, unavailable
}

// NWPathMonitorを使用した最新の実装
class ModernNetworkMonitor: NetworkMonitorProtocol {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("Network")
    private var currentPath: NWPath?

    var isReachable: Bool {
        currentPath?.status == .satisfied
    }

    func startMonitoring() {
        monitor.pathUpdateHandler = { [weak self] path in
            self?.currentPath = path
        }
        monitor.start(on: queue)
    }

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

移行の推奨事項

iOS 12+をターゲットとするプロジェクトでは、Reachabilityを完全にNWPathMonitorに置き換えてください。iOS 11をサポートするプロジェクトでは、条件付きコンパイル #available(iOS 12, *) をNWPathMonitorと共に使用し、Reachabilityをフォールバックとして使用します。これにより、古いデバイスのサポートを失うことなく段階的な移行が可能になります。

移行の主な利点はネットワークパスの詳細さです。NWPathMonitorは単に「到達可能/到達不可」だけでなく、各インターフェースのタイプ、コスト、優先順位、プロキシとVPNのサポートも報告します。これにより、開発者は現在のネットワーク状況に応じてアプリの動作を適応させるためのより多くのデータを得られます。

よくある質問

Reachabilityをサポートする最小iOSバージョンは?

SCNetworkReachabilityベースのReachabilityはiPhone OS 2(iOS 2)から利用可能です。このライブラリは現在のバージョンを含むすべてのiOSバージョンで動作します。制限はOSバージョンではなく、情報の詳細さに関するものです — 古いバージョンでは4Gと5Gを区別できません。

Reachabilityは単純なping確認とどう違うのですか?

ReachabilityはSCNetworkReachability — パケットを送信せずにネットワークスタックレベルでホストの到達可能性を評価するシステムサービス — を使用します。PingはICMPパケットを送信し、トラフィックを消費し、ファイアウォールによってブロックされる可能性もあります。Reachabilityは頻繁な確認においてより高速で安全です。

SwiftUIプロジェクトでReachabilityを使用できますか?

はい、ReachabilityはObservableObjectまたはCombineを介してSwiftUIで動作します。NotificationCenterにサブスクライブされたクラスにラップし、@Publishedを介してステータスを公開します。新しいSwiftUIプロジェクトでは、リアクティブなView更新のためにCombineパブリッシャーを使用したNWPathMonitorを推奨します。

ReachabilityはWi-Fiとセルラーデータをどのように区別しますか?

ReachabilityはSCNetworkReachabilityFlagsビットマスクのkSCNetworkReachabilityFlagsIsWWANフラグをチェックします。フラグが設定されている場合 — セルラーネットワーク(WWAN)を介した接続、設定されておらずホストがReachableの場合 — Wi-Fiを介した接続です。CoreTelephonyなしでタイプを区別する唯一の方法です。

Reachabilityが接続可能と表示するのにリクエストが失敗するのはなぜですか?

SCNetworkReachabilityはネットワークレベルでホストの到達可能性を確認しますが、上位プロトコルの動作を保証するものではありません。考えられる原因:キャプティブポータル、DNSブロッキング、プロキシサーバー、またはファイアウォール。Reachabilityは最初のフィルターですが、実際のHTTPリクエストの代替にはなりません。

まとめ

  • Reachability — SCNetworkReachability C APIを介して動作する、SystemConfigurationベースのiOSネットワーク監視ライブラリ。
  • 3つの状態 — Wi-Fi、セルラーデータ(WWAN)、利用不可 — はSCNetworkReachabilityFlagsビットフラグによって決定されます。
  • 非同期通知はRunLoopとNotificationCenterを使用したSCNetworkReachabilitySetCallbackを介して実装されます。
  • 制限 — Reachabilityは4G/5G、VPN、Ethernetを区別せず、トラフィックコスト情報を提供しません。
  • NWPathMonitor — iOS 12+向けのReachabilityの最新の代替で、タイプ、コスト、マルチパスを含む詳細なNWPathを提供します。
  • 移行にはNetworkMonitorProtocolを介してロジックを維持しながらSCNetworkReachabilityをNWPathMonitorに置き換えることが含まれます。
  • ReachabilityはiOS 11以下をサポートするプロジェクトや迅速な同期確認のために引き続き有用です。

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

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

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

こちらもお読みください