Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/connectivity_plus/connectivity_plus/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 2.3.0

- Add iOS ConnectivityProvider based on NWPathMonitor for iOS 12+.

## 2.2.2

- Reachability.swift ".unavailable" for iOS is deprecated.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import Foundation
import Network

@available(iOS 12, *)
public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {

private let queue = DispatchQueue.global(qos: .background)

private var _pathMonitor: NWPathMonitor?

public var currentConnectivityType: ConnectivityType {
let path = ensurePathMonitor().currentPath
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
return .wifi
} else if path.usesInterfaceType(.cellular) {
return .cellular
} else if path.usesInterfaceType(.wiredEthernet) {
// .wiredEthernet is available in simulator
// but for consistency it is probably correct to report .wifi
return .wifi
}
}
return .none
}

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

override init() {
super.init()
ensurePathMonitor()
}

public func start() {
ensurePathMonitor()
}

public func stop() {
_pathMonitor?.cancel()
_pathMonitor = nil
}

private func ensurePathMonitor() -> NWPathMonitor {
if (_pathMonitor == nil) {
let pathMonitor = NWPathMonitor()
pathMonitor.start(queue: queue)
pathMonitor.pathUpdateHandler = pathUpdateHandler
_pathMonitor = pathMonitor
}
return _pathMonitor!
}

private func pathUpdateHandler(path: NWPath) {
connectivityUpdateHandler?(currentConnectivityType)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import Foundation
import Reachability

public class ReachabilityConnectivityProvider: NSObject, ConnectivityProvider {
private var reachability: Reachability?
private var _reachability: Reachability?

public var currentConnectivityType: ConnectivityType {
let reachability = try? self.reachability ?? Reachability()
switch reachability?.connection {
let reachability = ensureReachability()
switch reachability.connection {
case .wifi:
return .wifi
case .cellular:
Expand All @@ -18,26 +18,39 @@ public class ReachabilityConnectivityProvider: NSObject, ConnectivityProvider {

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

override init() {
super.init()
ensureReachability()
}

public func start() {
reachability = try? Reachability()
let reachability = ensureReachability()

NotificationCenter.default.addObserver(
self,
selector: #selector(reachabilityChanged),
name: .reachabilityChanged,
object: reachability)

try? reachability?.startNotifier()
try? reachability.startNotifier()
}

public func stop() {
NotificationCenter.default.removeObserver(
self,
name: .reachabilityChanged,
object: reachability)
object: _reachability)

reachability?.stopNotifier()
reachability = nil
_reachability?.stopNotifier()
_reachability = nil
}

private func ensureReachability() -> Reachability {
if (_reachability == nil) {
let reachability = try? Reachability()
_reachability = reachability
}
return _reachability!
}

@objc private func reachabilityChanged(notification: NSNotification) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@ public class SwiftConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStream
name: "dev.fluttercommunity.plus/connectivity_status",
binaryMessenger: registrar.messenger())

let connectivityProvider = ReachabilityConnectivityProvider()
let connectivityProvider: ConnectivityProvider
if #available(iOS 12, *) {
connectivityProvider = PathMonitorConnectivityProvider()
} else {
connectivityProvider = ReachabilityConnectivityProvider()
}

let instance = SwiftConnectivityPlusPlugin(connectivityProvider: connectivityProvider)
streamChannel.setStreamHandler(instance)
Expand Down
4 changes: 2 additions & 2 deletions packages/connectivity_plus/connectivity_plus/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: connectivity_plus
description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS.
version: 2.2.2
version: 2.3.0
homepage: https://plus.fluttercommunity.dev/
repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/

Expand Down Expand Up @@ -30,7 +30,7 @@ dependencies:
sdk: flutter
connectivity_plus_platform_interface: ^1.2.0
connectivity_plus_linux: ^1.3.0
connectivity_plus_macos: ^1.2.0
connectivity_plus_macos: ^1.2.2
connectivity_plus_web: ^1.2.0
connectivity_plus_windows: ^1.2.0

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.2.2

- Fix connectivity stream can not be reused (after hot-restart) on MacOS 10.14+.

## 1.2.1

- Update license headers.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ import Network

@available(macOS 10.14, *)
public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {
private let pathMonitor = NWPathMonitor()

private let queue = DispatchQueue.global(qos: .background)

private var _pathMonitor: NWPathMonitor?

public var currentConnectivityType: ConnectivityType {
let path = pathMonitor.currentPath
let path = ensurePathMonitor().currentPath
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
return .wifi
Expand All @@ -23,15 +26,26 @@ public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {

override init() {
super.init()
pathMonitor.pathUpdateHandler = pathUpdateHandler
ensurePathMonitor()
}

public func start() {
pathMonitor.start(queue: .main)
ensurePathMonitor()
}

public func stop() {
pathMonitor.cancel()
_pathMonitor?.cancel()
_pathMonitor = nil
}

private func ensurePathMonitor() -> NWPathMonitor {
if (_pathMonitor == nil) {
let pathMonitor = NWPathMonitor()
pathMonitor.start(queue: queue)
pathMonitor.pathUpdateHandler = pathUpdateHandler
_pathMonitor = pathMonitor
}
return _pathMonitor!
}

private func pathUpdateHandler(path: NWPath) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import Foundation
import Reachability

public class ReachabilityConnectivityProvider: NSObject, ConnectivityProvider {
private var reachability: Reachability?
private var _reachability: Reachability?

public var currentConnectivityType: ConnectivityType {
let reachability = try? self.reachability ?? Reachability()
switch reachability?.connection ?? .unavailable {
let reachability = ensureReachability()
switch reachability.connection ?? .unavailable {
case .wifi:
return .wifi
case .cellular:
Expand All @@ -18,26 +18,39 @@ public class ReachabilityConnectivityProvider: NSObject, ConnectivityProvider {

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

override init() {
super.init()
ensureReachability()
}

public func start() {
reachability = try? Reachability()
let reachability = ensureReachability()

NotificationCenter.default.addObserver(
self,
selector: #selector(reachabilityChanged),
name: .reachabilityChanged,
object: reachability)

try? reachability?.startNotifier()
try? reachability.startNotifier()
}

public func stop() {
NotificationCenter.default.removeObserver(
self,
name: .reachabilityChanged,
object: reachability)
object: _reachability)

reachability?.stopNotifier()
reachability = nil
_reachability?.stopNotifier()
_reachability = nil
}

private func ensureReachability() -> Reachability {
if (_reachability == nil) {
let reachability = try? Reachability()
_reachability = reachability
}
return _reachability!
}

@objc private func reachabilityChanged(notification: NSNotification) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: connectivity_plus_macos
description: macOS implementation of the connectivity_plus plugin.
version: 1.2.1
version: 1.2.2
homepage: https://plus.fluttercommunity.dev/
repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/

Expand Down