Skip to content

fix(connectivity_plus): Resolve missing privacy manifest issue for iOS and MacOS #3458

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 5, 2025
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
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import UIKit
import Flutter

@UIApplicationMain
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C80D4294CF70F00263BE5 = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Cocoa
import FlutterMacOS

@NSApplicationMain
@main
class AppDelegate: FlutterAppDelegate {
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'connectivity_plus'
s.version = '0.0.1'
s.summary = 'Flutter Connectivity'
s.description = <<-DESC
This plugin allows Flutter apps to discover network connectivity and configure themselves accordingly.
Downloaded by pub (not CocoaPods).
DESC
s.homepage = 'https://plus.fluttercommunity.dev/'
s.license = { :type => 'BSD', :file => '../LICENSE' }
s.author = { 'Flutter Community Team' => 'authors@fluttercommunity.dev' }
s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus' }
s.documentation_url = 'https://pub.dev/packages/connectivity_plus'
s.source_files = 'connectivity_plus/Sources/connectivity_plus/**/*.swift'
s.dependency 'Flutter'
s.platform = :ios, '12.0'
s.swift_version = '5.0'
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
s.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo.xcprivacy']}
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
name: "connectivity_plus",
platforms: [
.iOS("12.0")
],
products: [
.library(name: "connectivity-plus", targets: ["connectivity_plus"])
],
dependencies: [],
targets: [
.target(
name: "connectivity_plus",
dependencies: [],
resources: [
.process("PrivacyInfo.xcprivacy"),
]
)
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source is governed by a BSD-style license that can
// be found in the LICENSE file.

import Flutter

public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
private let connectivityProvider: ConnectivityProvider
private var eventSink: FlutterEventSink?

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

public static func register(with registrar: FlutterPluginRegistrar) {
let binaryMessenger = registrar.messenger()

let channel = FlutterMethodChannel(
name: "dev.fluttercommunity.plus/connectivity",
binaryMessenger: binaryMessenger)

let streamChannel = FlutterEventChannel(
name: "dev.fluttercommunity.plus/connectivity_status",
binaryMessenger: binaryMessenger)

let connectivityProvider = PathMonitorConnectivityProvider()
let instance = ConnectivityPlusPlugin(connectivityProvider: connectivityProvider)
streamChannel.setStreamHandler(instance)

registrar.addMethodCallDelegate(instance, channel: channel)
}

public func detachFromEngine(for registrar: FlutterPluginRegistrar) {
eventSink = nil
connectivityProvider.stop()
}

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "check":
result(statusFrom(connectivityTypes: connectivityProvider.currentConnectivityTypes))
default:
result(FlutterMethodNotImplemented)
}
}

private func statusFrom(connectivityType: ConnectivityType) -> String {
switch connectivityType {
case .wifi:
return "wifi"
case .cellular:
return "mobile"
case .wiredEthernet:
return "ethernet"
case .other:
return "other"
case .none:
return "none"
}
}

private func statusFrom(connectivityTypes: [ConnectivityType]) -> [String] {
return connectivityTypes.map {
self.statusFrom(connectivityType: $0)
}
}

public func onListen(
withArguments _: Any?,
eventSink events: @escaping FlutterEventSink
) -> FlutterError? {
eventSink = events
connectivityProvider.start()
// Update this to handle a list
connectivityUpdateHandler(connectivityTypes: connectivityProvider.currentConnectivityTypes)
return nil
}

private func connectivityUpdateHandler(connectivityTypes: [ConnectivityType]) {
DispatchQueue.main.async {
self.eventSink?(self.statusFrom(connectivityTypes: connectivityTypes))
}
}

public func onCancel(withArguments _: Any?) -> FlutterError? {
connectivityProvider.stop()
eventSink = nil
return nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,10 @@ Downloaded by pub (not CocoaPods).
s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus' }
s.documentation_url = 'https://pub.dev/packages/connectivity_plus'
s.source_files = 'connectivity_plus/Sources/connectivity_plus/**/*.swift'
s.ios.dependency 'Flutter'
s.osx.dependency 'FlutterMacOS'
s.ios.deployment_target = '12.0'
s.dependency 'FlutterMacOS'
s.platform = :osx
s.osx.deployment_target = '10.14'
s.swift_version = '5.0'
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
s.ios.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo-ios.xcprivacy']}
s.osx.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo-osx.xcprivacy']}
s.resource_bundles = {'connectivity_plus_privacy' => ['connectivity_plus/Sources/connectivity_plus/PrivacyInfo.xcprivacy']}
end
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import PackageDescription
let package = Package(
name: "connectivity_plus",
platforms: [
.iOS("12.0"),
.macOS("10.14")
],
products: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,8 @@
// Use of this source is governed by a BSD-style license that can
// be found in the LICENSE file.

#if os(iOS)
import Flutter
#elseif os(macOS)
import Cocoa
import FlutterMacOS
#endif

public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
private let connectivityProvider: ConnectivityProvider
Expand All @@ -20,11 +16,7 @@ public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandl
}

public static func register(with registrar: FlutterPluginRegistrar) {
#if os(iOS)
let binaryMessenger = registrar.messenger()
#elseif os(macOS)
let binaryMessenger = registrar.messenger
#endif

let channel = FlutterMethodChannel(
name: "dev.fluttercommunity.plus/connectivity",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Foundation

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

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

var currentConnectivityTypes: [ConnectivityType] { get }

var connectivityUpdateHandler: ConnectivityUpdateHandler? { get set }

func start()

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

public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {

// Use .utility, as it is intended for tasks that the user does not track actively.
// See: https://developer.apple.com/documentation/dispatch/dispatchqos
private let queue = DispatchQueue.global(qos: .utility)

private var pathMonitor: NWPathMonitor?

private func connectivityFrom(path: NWPath) -> [ConnectivityType] {
var types: [ConnectivityType] = []

// Check for connectivity and append to types array as necessary
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
types.append(.wifi)
}
if path.usesInterfaceType(.cellular) {
types.append(.cellular)
}
if path.usesInterfaceType(.wiredEthernet) {
types.append(.wiredEthernet)
}
if path.usesInterfaceType(.other) {
types.append(.other)
}
}

return types.isEmpty ? [.none] : types
}

public var currentConnectivityTypes: [ConnectivityType] {
let path = ensurePathMonitor().currentPath
return connectivityFrom(path: path)
}

public var connectivityUpdateHandler: ConnectivityUpdateHandler?

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

public func start() {
_ = ensurePathMonitor()
}

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

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

private func pathUpdateHandler(path: NWPath) {
connectivityUpdateHandler?(connectivityFrom(path: path))
}
}
3 changes: 0 additions & 3 deletions packages/connectivity_plus/connectivity_plus/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,10 @@ flutter:
pluginClass: ConnectivityPlugin
ios:
pluginClass: ConnectivityPlusPlugin
sharedDarwinSource: true

linux:
dartPluginClass: ConnectivityPlusLinuxPlugin
macos:
pluginClass: ConnectivityPlusPlugin
sharedDarwinSource: true
web:
pluginClass: ConnectivityPlusWebPlugin
fileName: src/connectivity_plus_web.dart
Expand Down
Loading