【Swift】Reachabilityでネットワークの変化を監視する方法!
この記事からわかること
- Swiftのライブラリ:Reachabilityの導入方法と使い方
- ネットワーク接続状況の変化を監視する方法
- whenReachable/whenUnreachableメソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
ネットワークの変化を監視する方法
ネットワークの接続状況を取得できるReachabilityでネットワークの接続状況の変化を監視するにはwhenReachable
またはwhenUnreachable
メソッドを使用します。これらのメソッドでネットワークの接続状況の変化がおきた際に実行する処理を定義することができます。実際に監視を開始するにはstartNotifier
メソッドを実行する必要があります。
- whenReachable:ネットワークが繋がったことを検知
- whenUnreachable:ネットワークが切断されたことを検知
class ViewController: UIViewController {
private var reachability: Reachability? = nil
override func viewDidLoad() {
super.viewDidLoad()
reachability = try? Reachability()
reachability?.whenReachable = { reachability in
print("接続したよ:\(reachability.connection)")
}
reachability?.whenUnreachable = { reachability in
print("切断されたよ:\(reachability.connection)")
}
try? reachability?.startNotifier()
}
}
元となっているのはReachability
インスタンスなので当然ですがインスタンスが破棄されると監視も機能しなくなってしまいます。アプリ全体で監視させたい場合は以下のようにシングルトンのクラスなどを作成して実装すればOKです。
class NetworkStatusObservation {
static var shared = NetworkStatusObservation()
private var reachability: Reachability? = nil
init(){
reachability = try? Reachability()
}
public func startObserveNetworkStatus() {
reachability?.whenReachable = { reachability in
print("接続したよ:\(reachability.connection)")
}
reachability?.whenUnreachable = { reachability in
print("切断されたよ:\(reachability.connection)")
}
try? reachability?.startNotifier()
}
}
NotificationCenterで実装する
NotificationCenter
を使用してネットワークの接続状況の変化を監視することも可能です。その場合はNSNotification.Name
型にreachabilityChanged
を指定します。
おすすめ記事:【Swift】NotificationCenterクラスの使い方!NSNotification.Name型の種類!
NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged), name: .reachabilityChanged, object: reachability)
@objc func reachabilityChanged() {
print(reachability?.connection)
}
アプリ全体で使用しやすいようにクラスに切り出す場合は以下のような感じですかね!
class ViewController: UIViewController {
private let networkStatusObservation = NetworkStatusObservation.shared
private var cancellable: AnyCancellable?
override func viewDidLoad() {
super.viewDidLoad()
cancellable = networkStatusObservation.networkStatusPublisher
.sink { status in
if status == .wifi {
print("ネットワークに接続されました")
} else {
print("ネットワークに接続されていません")
}
}
}
}
class NetworkStatusObservation {
static let shared = NetworkStatusObservation()
private let reachability: Reachability?
private var cancellables = Set<AnyCancellable>()
// Reachabilityの状態を通知するPublisher
private let _networkStatusPublisher = PassthroughSubject<Reachability.Connection, Never>()
// Reachabilityの状態を公開するPublisherを取得する
public var networkStatusPublisher: AnyPublisher<Reachability.Connection, Never> {
_networkStatusPublisher.eraseToAnyPublisher()
}
private init(){
reachability = try? Reachability()
// NotificationCenterでReachabilityの通知を購読する
NotificationCenter.default.publisher(for: .reachabilityChanged, object: reachability)
.compactMap { $0.object as? Reachability }
.sink { reachability in
self._networkStatusPublisher.send(reachability.connection)
}
.store(in: &cancellables)
// Reachabilityの監視を開始する
try? reachability?.startNotifier()
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。