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 @@
## 1.4.0

- [MacOS]: Backport to macOS 10.11

## 1.3.0

- Add ethernet as connectivity result. Supported on Android, iOS, Windows, Linux, macOS, and Web
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
Expand Down Expand Up @@ -497,7 +497,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
Expand Down Expand Up @@ -544,7 +544,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,5 @@ Pod::Spec.new do |s|
s.public_header_files = 'Classes/**/*.h'

s.platform = :osx
s.osx.deployment_target = '10.14'
s.osx.deployment_target = '10.11'
end

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: 1.3.0
version: 1.4.0
homepage: https://plus.fluttercommunity.dev/
repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/

Expand Down Expand Up @@ -31,7 +31,7 @@ dependencies:
meta: ^1.3.0
connectivity_plus_platform_interface: ^1.1.0
connectivity_plus_linux: ^1.1.0
connectivity_plus_macos: ^1.1.0
connectivity_plus_macos: ^1.2.0
connectivity_plus_web: ^1.1.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.0

- Backport to macOS 10.11

## 1.1.0

- Add ethernet as connectivity result.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,15 @@

import Cocoa
import FlutterMacOS
import Network
import SystemConfiguration.CaptiveNetwork

public class ConnectivityPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
var eventSink: FlutterEventSink?
var pathMonitor = NWPathMonitor()
private let connectivityProvider: ConnectivityProvider
private var eventSink: FlutterEventSink?

override init() {
init(connectivityProvider: ConnectivityProvider) {
self.connectivityProvider = connectivityProvider
super.init()
pathMonitor.pathUpdateHandler = pathUpdateHandler
self.connectivityProvider.connectivityUpdateHandler = connectivityUpdateHandler
}

public static func register(with registrar: FlutterPluginRegistrar) {
Expand All @@ -35,7 +34,14 @@ public class ConnectivityPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
name: "dev.fluttercommunity.plus/connectivity_status",
binaryMessenger: registrar.messenger)

let instance = ConnectivityPlugin()
let connectivityProvider: ConnectivityProvider
if #available(macOS 10.14, *) {
connectivityProvider = PathMonitorConnectivityProvider()
} else {
connectivityProvider = ReachabilityConnectivityProvider()
}

let instance = ConnectivityPlugin(connectivityProvider: connectivityProvider)
streamChannel.setStreamHandler(instance)

registrar.addMethodCallDelegate(instance, channel: channel)
Expand All @@ -44,45 +50,41 @@ public class ConnectivityPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "check":
result(statusFromPath(path: pathMonitor.currentPath))
result(statusFrom(connectivityType: connectivityProvider.currentConnectivityType))
default:
result(FlutterMethodNotImplemented)
}
}

/// Returns a string describing connection type
///
/// - Parameters:
/// - path: an instance of NWPath
/// - Returns: connection type string
private func statusFromPath(path: NWPath) -> String {
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
return "wifi"
} else if path.usesInterfaceType(.cellular) {
return "mobile"
} else if path.usesInterfaceType(.wiredEthernet) {
return "ethernet"
}
private func statusFrom(connectivityType: ConnectivityType) -> String {
switch connectivityType {
case .wifi:
return "wifi"
case .cellular:
return "mobile"
case .wiredEthernet:
return "ethernet"
case .none:
return "none"
}
return "none"
}

public func onListen(
withArguments _: Any?,
eventSink events: @escaping FlutterEventSink
) -> FlutterError? {
eventSink = events
pathMonitor.start(queue: .global(qos: .background))
connectivityProvider.start()
connectivityUpdateHandler(connectivityType: connectivityProvider.currentConnectivityType)
return nil
}

private func pathUpdateHandler(path: NWPath) {
eventSink?(statusFromPath(path: path))
private func connectivityUpdateHandler(connectivityType: ConnectivityType) {
eventSink?(statusFrom(connectivityType: connectivityType))
}

public func onCancel(withArguments _: Any?) -> FlutterError? {
pathMonitor.cancel()
connectivityProvider.stop()
eventSink = nil
return nil
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import Foundation

public enum ConnectivityType {
case none
case wiredEthernet
case wifi
case cellular
}

public protocol ConnectivityProvider: NSObjectProtocol {
typealias ConnectivityUpdateHandler = (ConnectivityType) -> Void

var currentConnectivityType: ConnectivityType { get }

var connectivityUpdateHandler: ConnectivityUpdateHandler? { get set }

func start()

func stop()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import Foundation
import Network

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

public var currentConnectivityType: ConnectivityType {
let path = pathMonitor.currentPath
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
return .wifi
} else if path.usesInterfaceType(.cellular) {
return .cellular
} else if path.usesInterfaceType(.wiredEthernet) {
return .wiredEthernet
}
}
return .none
}

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

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

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

public func stop() {
pathMonitor.cancel()
}

private func pathUpdateHandler(path: NWPath) {
connectivityUpdateHandler?(currentConnectivityType)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import Foundation
import Reachability

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

public var currentConnectivityType: ConnectivityType {
let reachability = try? self.reachability ?? Reachability()
switch reachability?.connection ?? .unavailable {
case .wifi:
return .wifi
case .cellular:
return .cellular
default:
return .none
}
}

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

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

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

try? reachability?.startNotifier()
}

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

reachability?.stopNotifier()
reachability = nil
}

@objc private func reachabilityChanged(notification: NSNotification) {
connectivityUpdateHandler?(currentConnectivityType)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ Pod::Spec.new do |s|
s.documentation_url = 'https://pub.dev/packages/connectivity_plus'
s.source_files = 'Classes/**/*'
s.dependency 'FlutterMacOS'
s.dependency 'ReachabilitySwift'

s.platform = :osx
s.osx.deployment_target = '10.14'
end
s.osx.deployment_target = '10.11'
end
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.1.0
version: 1.2.0
homepage: https://plus.fluttercommunity.dev/
repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/

Expand Down