From 7a6ab690c0cd133958236ffa3bd145dac1b233f8 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Mon, 27 Sep 2021 09:46:41 +0300 Subject: [PATCH 1/6] [connectivity_plus_macos] backport to macOS 10.11 --- .../macos/Runner.xcodeproj/project.pbxproj | 6 +- .../macos/connectivity_plus.podspec | 3 +- .../macos/Classes/ConnectivityPlugin.swift | 56 ++++++++++--------- .../macos/Classes/ConnectivityProvider.swift | 20 +++++++ .../PathMonitorConnectivityProvider.swift | 40 +++++++++++++ .../ReachabilityConnectivityProvider.swift | 46 +++++++++++++++ .../macos/connectivity_plus_macos.podspec | 5 +- 7 files changed, 142 insertions(+), 34 deletions(-) create mode 100644 packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityProvider.swift create mode 100644 packages/connectivity_plus/connectivity_plus_macos/macos/Classes/PathMonitorConnectivityProvider.swift create mode 100644 packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ReachabilityConnectivityProvider.swift diff --git a/packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/project.pbxproj b/packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/project.pbxproj index f0d9fe875e..0e2413493f 100644 --- a/packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/project.pbxproj @@ -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; @@ -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; @@ -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; diff --git a/packages/connectivity_plus/connectivity_plus/macos/connectivity_plus.podspec b/packages/connectivity_plus/connectivity_plus/macos/connectivity_plus.podspec index 6601c10e73..378a5374b5 100644 --- a/packages/connectivity_plus/connectivity_plus/macos/connectivity_plus.podspec +++ b/packages/connectivity_plus/connectivity_plus/macos/connectivity_plus.podspec @@ -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 - diff --git a/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityPlugin.swift b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityPlugin.swift index 4f63f8de44..5563310a66 100644 --- a/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityPlugin.swift +++ b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityPlugin.swift @@ -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) { @@ -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) @@ -44,28 +50,23 @@ 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( @@ -73,16 +74,17 @@ public class ConnectivityPlugin: NSObject, FlutterPlugin, FlutterStreamHandler { 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 } diff --git a/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityProvider.swift b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityProvider.swift new file mode 100644 index 0000000000..e9d6a801b7 --- /dev/null +++ b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ConnectivityProvider.swift @@ -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() +} diff --git a/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/PathMonitorConnectivityProvider.swift b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/PathMonitorConnectivityProvider.swift new file mode 100644 index 0000000000..4f9e0e0117 --- /dev/null +++ b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/PathMonitorConnectivityProvider.swift @@ -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) + } +} diff --git a/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ReachabilityConnectivityProvider.swift b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ReachabilityConnectivityProvider.swift new file mode 100644 index 0000000000..72bb0f19c5 --- /dev/null +++ b/packages/connectivity_plus/connectivity_plus_macos/macos/Classes/ReachabilityConnectivityProvider.swift @@ -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) + } +} diff --git a/packages/connectivity_plus/connectivity_plus_macos/macos/connectivity_plus_macos.podspec b/packages/connectivity_plus/connectivity_plus_macos/macos/connectivity_plus_macos.podspec index 3971b04539..c619b04cbd 100644 --- a/packages/connectivity_plus/connectivity_plus_macos/macos/connectivity_plus_macos.podspec +++ b/packages/connectivity_plus/connectivity_plus_macos/macos/connectivity_plus_macos.podspec @@ -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 \ No newline at end of file + s.osx.deployment_target = '10.11' +end From 1b219a8d17141fe4e4fdb34bb82ab5a3287fa448 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Sat, 2 Oct 2021 10:40:45 +0300 Subject: [PATCH 2/6] add changelog and pump version --- .../connectivity_plus/connectivity_plus_macos/CHANGELOG.md | 4 ++++ .../connectivity_plus/connectivity_plus_macos/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/connectivity_plus/connectivity_plus_macos/CHANGELOG.md b/packages/connectivity_plus/connectivity_plus_macos/CHANGELOG.md index 4f9609f2c1..d34ea587c0 100644 --- a/packages/connectivity_plus/connectivity_plus_macos/CHANGELOG.md +++ b/packages/connectivity_plus/connectivity_plus_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.0 + +- Backport to macOS 10.11 + ## 1.1.0 - Add ethernet as connectivity result. diff --git a/packages/connectivity_plus/connectivity_plus_macos/pubspec.yaml b/packages/connectivity_plus/connectivity_plus_macos/pubspec.yaml index 4971e92574..51fbd60f14 100644 --- a/packages/connectivity_plus/connectivity_plus_macos/pubspec.yaml +++ b/packages/connectivity_plus/connectivity_plus_macos/pubspec.yaml @@ -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/ From 825f08819c6e425a97111222543e6e871331ecf8 Mon Sep 17 00:00:00 2001 From: Majid Hajian Date: Sun, 3 Oct 2021 21:18:29 +0200 Subject: [PATCH 3/6] Update pubspec.yaml --- packages/connectivity_plus/connectivity_plus/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectivity_plus/connectivity_plus/pubspec.yaml b/packages/connectivity_plus/connectivity_plus/pubspec.yaml index 1dda54e660..a786e415ba 100644 --- a/packages/connectivity_plus/connectivity_plus/pubspec.yaml +++ b/packages/connectivity_plus/connectivity_plus/pubspec.yaml @@ -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.1.0 From cb7da94e9b0bb674a6888aadf6f6b7cdcbb64950 Mon Sep 17 00:00:00 2001 From: Majid Hajian Date: Sun, 3 Oct 2021 21:18:52 +0200 Subject: [PATCH 4/6] Update pubspec.yaml --- packages/connectivity_plus/connectivity_plus/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectivity_plus/connectivity_plus/pubspec.yaml b/packages/connectivity_plus/connectivity_plus/pubspec.yaml index a786e415ba..f6da6407d1 100644 --- a/packages/connectivity_plus/connectivity_plus/pubspec.yaml +++ b/packages/connectivity_plus/connectivity_plus/pubspec.yaml @@ -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.2.0 +version: 1.3.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ From 94f2acb13501ceea886aad928d68f6e1795c2f8c Mon Sep 17 00:00:00 2001 From: Majid Hajian Date: Sun, 3 Oct 2021 21:19:38 +0200 Subject: [PATCH 5/6] Update CHANGELOG.md --- packages/connectivity_plus/connectivity_plus/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/connectivity_plus/connectivity_plus/CHANGELOG.md b/packages/connectivity_plus/connectivity_plus/CHANGELOG.md index 14062c8f11..a95f08094a 100644 --- a/packages/connectivity_plus/connectivity_plus/CHANGELOG.md +++ b/packages/connectivity_plus/connectivity_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0 + +- [MacOS]: Backport to macOS 10.11 + ## 1.2.0 - migrate integration_test to flutter sdk From 7df52e797db0bc5bce3a90756559d73f4a8f38e9 Mon Sep 17 00:00:00 2001 From: Majid Hajian Date: Sun, 3 Oct 2021 21:20:56 +0200 Subject: [PATCH 6/6] Update pubspec.yaml --- packages/connectivity_plus/connectivity_plus/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectivity_plus/connectivity_plus/pubspec.yaml b/packages/connectivity_plus/connectivity_plus/pubspec.yaml index ac6c6d00f8..2d812d6618 100644 --- a/packages/connectivity_plus/connectivity_plus/pubspec.yaml +++ b/packages/connectivity_plus/connectivity_plus/pubspec.yaml @@ -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/