mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 20:29:53 +00:00
* ios: network observer * update * remove metered * update tcpTimeoutPerKb * network connection in settings --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
73 lines
2.1 KiB
Swift
73 lines
2.1 KiB
Swift
//
|
|
// NetworkObserver.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Avently on 05.04.2024.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Network
|
|
import SimpleXChat
|
|
|
|
class NetworkObserver {
|
|
static let shared = NetworkObserver()
|
|
private let queue: DispatchQueue = DispatchQueue(label: "chat.simplex.app.NetworkObserver")
|
|
private var prevInfo: UserNetworkInfo? = nil
|
|
private var monitor: NWPathMonitor?
|
|
private let monitorLock: DispatchQueue = DispatchQueue(label: "chat.simplex.app.monitorLock")
|
|
|
|
func restartMonitor() {
|
|
monitorLock.sync {
|
|
monitor?.cancel()
|
|
let mon = NWPathMonitor()
|
|
mon.pathUpdateHandler = { [weak self] path in
|
|
self?.networkPathChanged(path: path)
|
|
}
|
|
mon.start(queue: queue)
|
|
monitor = mon
|
|
}
|
|
}
|
|
|
|
private func networkPathChanged(path: NWPath) {
|
|
let info = UserNetworkInfo(
|
|
networkType: networkTypeFromPath(path),
|
|
online: path.status == .satisfied
|
|
)
|
|
if (prevInfo != info) {
|
|
prevInfo = info
|
|
setNetworkInfo(info)
|
|
}
|
|
}
|
|
|
|
private func networkTypeFromPath(_ path: NWPath) -> UserNetworkType {
|
|
if path.usesInterfaceType(.wiredEthernet) {
|
|
.ethernet
|
|
} else if path.usesInterfaceType(.wifi) {
|
|
.wifi
|
|
} else if path.usesInterfaceType(.cellular) {
|
|
.cellular
|
|
} else if path.usesInterfaceType(.other) {
|
|
.other
|
|
} else {
|
|
.none
|
|
}
|
|
}
|
|
|
|
private static var networkObserver: NetworkObserver? = nil
|
|
|
|
private func setNetworkInfo(_ info: UserNetworkInfo) {
|
|
logger.debug("setNetworkInfo Network changed: \(String(describing: info))")
|
|
DispatchQueue.main.sync {
|
|
ChatModel.shared.networkInfo = info
|
|
}
|
|
if !hasChatCtrl() { return }
|
|
self.monitorLock.sync {
|
|
do {
|
|
try apiSetNetworkInfo(info)
|
|
} catch let err {
|
|
logger.error("setNetworkInfo error: \(responseError(err))")
|
|
}
|
|
}
|
|
}
|
|
}
|