Skip to content

Commit dab9207

Browse files
fix(connectivity_plus): Resolve missing privacy manifest issue for iOS and MacOS (#3458)
1 parent 6eec56c commit dab9207

File tree

17 files changed

+236
-21
lines changed

17 files changed

+236
-21
lines changed

packages/connectivity_plus/connectivity_plus/example/ios/Runner/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import UIKit
22
import Flutter
33

4-
@UIApplicationMain
4+
@main
55
@objc class AppDelegate: FlutterAppDelegate {
66
override func application(
77
_ application: UIApplication,

packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@
259259
isa = PBXProject;
260260
attributes = {
261261
LastSwiftUpdateCheck = 0920;
262-
LastUpgradeCheck = 1300;
262+
LastUpgradeCheck = 1510;
263263
ORGANIZATIONNAME = "";
264264
TargetAttributes = {
265265
331C80D4294CF70F00263BE5 = {

packages/connectivity_plus/connectivity_plus/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1300"
3+
LastUpgradeVersion = "1510"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

packages/connectivity_plus/connectivity_plus/example/macos/Runner/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Cocoa
22
import FlutterMacOS
33

4-
@NSApplicationMain
4+
@main
55
class AppDelegate: FlutterAppDelegate {
66
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
77
return true
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#
2+
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
3+
#
4+
Pod::Spec.new do |s|
5+
s.name = 'connectivity_plus'
6+
s.version = '0.0.1'
7+
s.summary = 'Flutter Connectivity'
8+
s.description = <<-DESC
9+
This plugin allows Flutter apps to discover network connectivity and configure themselves accordingly.
10+
Downloaded by pub (not CocoaPods).
11+
DESC
12+
s.homepage = 'https://plus.fluttercommunity.dev/'
13+
s.license = { :type => 'BSD', :file => '../LICENSE' }
14+
s.author = { 'Flutter Community Team' => 'authors@fluttercommunity.dev' }
15+
s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus' }
16+
s.documentation_url = 'https://pub.dev/packages/connectivity_plus'
17+
s.source_files = 'connectivity_plus/Sources/connectivity_plus/**/*.swift'
18+
s.dependency 'Flutter'
19+
s.platform = :ios, '12.0'
20+
s.swift_version = '5.0'
21+
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
22+
s.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo.xcprivacy']}
23+
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// swift-tools-version: 5.9
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "connectivity_plus",
8+
platforms: [
9+
.iOS("12.0")
10+
],
11+
products: [
12+
.library(name: "connectivity-plus", targets: ["connectivity_plus"])
13+
],
14+
dependencies: [],
15+
targets: [
16+
.target(
17+
name: "connectivity_plus",
18+
dependencies: [],
19+
resources: [
20+
.process("PrivacyInfo.xcprivacy"),
21+
]
22+
)
23+
]
24+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// Copyright 2019 The Chromium Authors. All rights reserved.
2+
// Use of this source is governed by a BSD-style license that can
3+
// be found in the LICENSE file.
4+
5+
import Flutter
6+
7+
public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
8+
private let connectivityProvider: ConnectivityProvider
9+
private var eventSink: FlutterEventSink?
10+
11+
init(connectivityProvider: ConnectivityProvider) {
12+
self.connectivityProvider = connectivityProvider
13+
super.init()
14+
self.connectivityProvider.connectivityUpdateHandler = connectivityUpdateHandler
15+
}
16+
17+
public static func register(with registrar: FlutterPluginRegistrar) {
18+
let binaryMessenger = registrar.messenger()
19+
20+
let channel = FlutterMethodChannel(
21+
name: "dev.fluttercommunity.plus/connectivity",
22+
binaryMessenger: binaryMessenger)
23+
24+
let streamChannel = FlutterEventChannel(
25+
name: "dev.fluttercommunity.plus/connectivity_status",
26+
binaryMessenger: binaryMessenger)
27+
28+
let connectivityProvider = PathMonitorConnectivityProvider()
29+
let instance = ConnectivityPlusPlugin(connectivityProvider: connectivityProvider)
30+
streamChannel.setStreamHandler(instance)
31+
32+
registrar.addMethodCallDelegate(instance, channel: channel)
33+
}
34+
35+
public func detachFromEngine(for registrar: FlutterPluginRegistrar) {
36+
eventSink = nil
37+
connectivityProvider.stop()
38+
}
39+
40+
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
41+
switch call.method {
42+
case "check":
43+
result(statusFrom(connectivityTypes: connectivityProvider.currentConnectivityTypes))
44+
default:
45+
result(FlutterMethodNotImplemented)
46+
}
47+
}
48+
49+
private func statusFrom(connectivityType: ConnectivityType) -> String {
50+
switch connectivityType {
51+
case .wifi:
52+
return "wifi"
53+
case .cellular:
54+
return "mobile"
55+
case .wiredEthernet:
56+
return "ethernet"
57+
case .other:
58+
return "other"
59+
case .none:
60+
return "none"
61+
}
62+
}
63+
64+
private func statusFrom(connectivityTypes: [ConnectivityType]) -> [String] {
65+
return connectivityTypes.map {
66+
self.statusFrom(connectivityType: $0)
67+
}
68+
}
69+
70+
public func onListen(
71+
withArguments _: Any?,
72+
eventSink events: @escaping FlutterEventSink
73+
) -> FlutterError? {
74+
eventSink = events
75+
connectivityProvider.start()
76+
// Update this to handle a list
77+
connectivityUpdateHandler(connectivityTypes: connectivityProvider.currentConnectivityTypes)
78+
return nil
79+
}
80+
81+
private func connectivityUpdateHandler(connectivityTypes: [ConnectivityType]) {
82+
DispatchQueue.main.async {
83+
self.eventSink?(self.statusFrom(connectivityTypes: connectivityTypes))
84+
}
85+
}
86+
87+
public func onCancel(withArguments _: Any?) -> FlutterError? {
88+
connectivityProvider.stop()
89+
eventSink = nil
90+
return nil
91+
}
92+
}

packages/connectivity_plus/connectivity_plus/darwin/connectivity_plus.podspec renamed to packages/connectivity_plus/connectivity_plus/macos/connectivity_plus.podspec

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ Downloaded by pub (not CocoaPods).
1515
s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus' }
1616
s.documentation_url = 'https://pub.dev/packages/connectivity_plus'
1717
s.source_files = 'connectivity_plus/Sources/connectivity_plus/**/*.swift'
18-
s.ios.dependency 'Flutter'
19-
s.osx.dependency 'FlutterMacOS'
20-
s.ios.deployment_target = '12.0'
18+
s.dependency 'FlutterMacOS'
19+
s.platform = :osx
2120
s.osx.deployment_target = '10.14'
2221
s.swift_version = '5.0'
2322
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
24-
s.ios.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo-ios.xcprivacy']}
25-
s.osx.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo-osx.xcprivacy']}
23+
s.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo.xcprivacy']}
2624
end

packages/connectivity_plus/connectivity_plus/darwin/connectivity_plus/Package.swift renamed to packages/connectivity_plus/connectivity_plus/macos/connectivity_plus/Package.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import PackageDescription
66
let package = Package(
77
name: "connectivity_plus",
88
platforms: [
9-
.iOS("12.0"),
109
.macOS("10.14")
1110
],
1211
products: [
Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@
22
// Use of this source is governed by a BSD-style license that can
33
// be found in the LICENSE file.
44

5-
#if os(iOS)
6-
import Flutter
7-
#elseif os(macOS)
85
import Cocoa
96
import FlutterMacOS
10-
#endif
117

128
public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
139
private let connectivityProvider: ConnectivityProvider
@@ -20,11 +16,7 @@ public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandl
2016
}
2117

2218
public static func register(with registrar: FlutterPluginRegistrar) {
23-
#if os(iOS)
24-
let binaryMessenger = registrar.messenger()
25-
#elseif os(macOS)
2619
let binaryMessenger = registrar.messenger
27-
#endif
2820

2921
let channel = FlutterMethodChannel(
3022
name: "dev.fluttercommunity.plus/connectivity",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Foundation
2+
3+
public enum ConnectivityType {
4+
case none
5+
case wiredEthernet
6+
case wifi
7+
case cellular
8+
case other
9+
}
10+
11+
public protocol ConnectivityProvider: NSObjectProtocol {
12+
typealias ConnectivityUpdateHandler = ([ConnectivityType]) -> Void
13+
14+
var currentConnectivityTypes: [ConnectivityType] { get }
15+
16+
var connectivityUpdateHandler: ConnectivityUpdateHandler? { get set }
17+
18+
func start()
19+
20+
func stop()
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import Foundation
2+
import Network
3+
4+
public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {
5+
6+
// Use .utility, as it is intended for tasks that the user does not track actively.
7+
// See: https://developer.apple.com/documentation/dispatch/dispatchqos
8+
private let queue = DispatchQueue.global(qos: .utility)
9+
10+
private var pathMonitor: NWPathMonitor?
11+
12+
private func connectivityFrom(path: NWPath) -> [ConnectivityType] {
13+
var types: [ConnectivityType] = []
14+
15+
// Check for connectivity and append to types array as necessary
16+
if path.status == .satisfied {
17+
if path.usesInterfaceType(.wifi) {
18+
types.append(.wifi)
19+
}
20+
if path.usesInterfaceType(.cellular) {
21+
types.append(.cellular)
22+
}
23+
if path.usesInterfaceType(.wiredEthernet) {
24+
types.append(.wiredEthernet)
25+
}
26+
if path.usesInterfaceType(.other) {
27+
types.append(.other)
28+
}
29+
}
30+
31+
return types.isEmpty ? [.none] : types
32+
}
33+
34+
public var currentConnectivityTypes: [ConnectivityType] {
35+
let path = ensurePathMonitor().currentPath
36+
return connectivityFrom(path: path)
37+
}
38+
39+
public var connectivityUpdateHandler: ConnectivityUpdateHandler?
40+
41+
override init() {
42+
super.init()
43+
_ = ensurePathMonitor()
44+
}
45+
46+
public func start() {
47+
_ = ensurePathMonitor()
48+
}
49+
50+
public func stop() {
51+
pathMonitor?.cancel()
52+
pathMonitor = nil
53+
}
54+
55+
@discardableResult
56+
private func ensurePathMonitor() -> NWPathMonitor {
57+
if (pathMonitor == nil) {
58+
let pathMonitor = NWPathMonitor()
59+
pathMonitor.start(queue: queue)
60+
pathMonitor.pathUpdateHandler = pathUpdateHandler
61+
self.pathMonitor = pathMonitor
62+
}
63+
return self.pathMonitor!
64+
}
65+
66+
private func pathUpdateHandler(path: NWPath) {
67+
connectivityUpdateHandler?(connectivityFrom(path: path))
68+
}
69+
}

packages/connectivity_plus/connectivity_plus/pubspec.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@ flutter:
2222
pluginClass: ConnectivityPlugin
2323
ios:
2424
pluginClass: ConnectivityPlusPlugin
25-
sharedDarwinSource: true
26-
2725
linux:
2826
dartPluginClass: ConnectivityPlusLinuxPlugin
2927
macos:
3028
pluginClass: ConnectivityPlusPlugin
31-
sharedDarwinSource: true
3229
web:
3330
pluginClass: ConnectivityPlusWebPlugin
3431
fileName: src/connectivity_plus_web.dart

0 commit comments

Comments
 (0)