Reachabilityは、SystemConfigurationフレームワーク上に構築されたiOSおよびmacOS用のライブラリで、インターネット接続の可用性を確認し、その変更を追跡できます。Apple Developerドキュメント(2025)によると、Reachabilityは非同期ネットワーク監視にSCNetworkReachabilityを使用しています。Reachabilityライブラリは、ネイティブのNWPathMonitorが登場するまで、長い間iOSプロジェクトの標準でした。
重要なポイント
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の主要なメカニズムはSCNetworkReachabilityCreateWithName関数で、指定されたホストの追跡オブジェクトを作成します。次にSCNetworkReachabilityGetFlagsが呼び出されます — 現在のネットワーク状態でSCNetworkReachabilityFlagsのビットマスクを返す同期チェックです。
非同期監視にはSCNetworkReachabilitySetCallbackが使用され、Cコールバック関数を登録します。ホストの到達可能性状態が変わると、コールバックは現在のRunLoopで実行されます。ReachabilityはこのCコールバックをObjective-Cメソッドにラップし、NotificationCenterを介して通知を送信します。
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はこれらのフラグを考慮してインターフェースタイプを決定します。
iOSアプリでのReachabilityの標準的な使用パターンは、インスタンスの作成、通知へのサブスクライブ、ステータス変更への対応を含みます。以下の例は、ネットワーク変更時にUIを更新するためのNotificationCenterとの統合を示しています。
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は3つの主要な接続状態を区別します:Wi-Fi、セルラーデータ(WWAN)、利用不可。WWANにはすべてのセルラー接続タイプ — 2G、3G、4G/LTE、5G — が含まれます。ライブラリはWWAN内の詳細を提供しないため、4Gと5Gを区別するにはCoreTelephonyが必要です。
| 状態 | SCNetworkフラグ | 説明 |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | ホストアクセス可能なWi-Fiネットワークを介した接続 |
| ReachableViaWWAN | Reachable + IsWWAN | セルラーネットワーク(2G-5G)を介した接続 |
| NotReachable | !Reachable | どのインターフェースを介してもホストに到達不可 |
| ConnectionRequired | Reachable + ConnectionRequired | 接続確立が必要(VPN、PPPoE) |
ReachabilityはEthernet、VPNトンネル、マルチパス接続を区別しません — すべての非WWANインターフェースはWi-Fiとして分類されます。この制限は、基本的な分類を超えたネットワークインターフェースに関する詳細情報を提供しないSystemConfigurationのアーキテクチャに起因します。
特定のセルラー接続タイプ(4G vs 5G)を判断するには、CoreTelephonyのCTTelephonyNetworkInfoが必要です。ReachabilityをCoreTelephonyと組み合わせることで、アプリはコンテンツ品質を選択できます:5Gでは4Kストリーミング、4G/LTEではHD、3GではSDまたは音声のみ。
AppleはiOS 12以降のすべての新規プロジェクトでReachabilityをNWPathMonitorに置き換えることを推奨しています。主な理由は、NWPathMonitorが最新のNetworkフレームワークの一部であり、Swiftで書かれ、Combineをサポートし、C互換性なしで詳細なネットワークパス情報を提供することです。
移行プロセスには、SCNetworkReachabilityをNWPathMonitorに置き換え、NotificationCenterからpathUpdateHandlerクロージャまたはCombineパブリッシャーに切り替えることが含まれます。ネットワークステータス処理のアルゴリズムとロジックは同じままです — 監視APIのみが変更されます。
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のサポートも報告します。これにより、開発者は現在のネットワーク状況に応じてアプリの動作を適応させるためのより多くのデータを得られます。
よくある質問
SCNetworkReachabilityベースのReachabilityはiPhone OS 2(iOS 2)から利用可能です。このライブラリは現在のバージョンを含むすべてのiOSバージョンで動作します。制限はOSバージョンではなく、情報の詳細さに関するものです — 古いバージョンでは4Gと5Gを区別できません。
ReachabilityはSCNetworkReachability — パケットを送信せずにネットワークスタックレベルでホストの到達可能性を評価するシステムサービス — を使用します。PingはICMPパケットを送信し、トラフィックを消費し、ファイアウォールによってブロックされる可能性もあります。Reachabilityは頻繁な確認においてより高速で安全です。
はい、ReachabilityはObservableObjectまたはCombineを介してSwiftUIで動作します。NotificationCenterにサブスクライブされたクラスにラップし、@Publishedを介してステータスを公開します。新しいSwiftUIプロジェクトでは、リアクティブなView更新のためにCombineパブリッシャーを使用したNWPathMonitorを推奨します。
ReachabilityはSCNetworkReachabilityFlagsビットマスクのkSCNetworkReachabilityFlagsIsWWANフラグをチェックします。フラグが設定されている場合 — セルラーネットワーク(WWAN)を介した接続、設定されておらずホストがReachableの場合 — Wi-Fiを介した接続です。CoreTelephonyなしでタイプを区別する唯一の方法です。
SCNetworkReachabilityはネットワークレベルでホストの到達可能性を確認しますが、上位プロトコルの動作を保証するものではありません。考えられる原因:キャプティブポータル、DNSブロッキング、プロキシサーバー、またはファイアウォール。Reachabilityは最初のフィルターですが、実際のHTTPリクエストの代替にはなりません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。