From 831200038ee6d64734959354513abc762894a788 Mon Sep 17 00:00:00 2001 From: Vasu Nageshri Date: Tue, 9 Jun 2026 18:00:30 +0530 Subject: [PATCH 1/2] feat: Add Swift Package Manager support for iOS and macOS Migrate plugin sources to SPM-compatible directory structure and add Package.swift for iOS and macOS with FlutterFramework dependency. --- .gitignore | 6 ++++- CHANGELOG.md | 1 + ios/.gitignore | 4 +++- ios/Classes/AudioWaveformsPlugin.h | 4 ---- ios/Classes/AudioWaveformsPlugin.m | 15 ------------ ios/audio_waveforms.podspec | 4 ++-- ios/audio_waveforms/Package.swift | 24 +++++++++++++++++++ .../audio_waveforms}/AudioPlayer.swift | 5 ++-- .../audio_waveforms}/AudioRecorder.swift | 1 + .../AudioWaveformsPlugin.swift} | 4 ++-- .../RecorderBytesStreamEngine.swift | 1 + .../audio_waveforms}/RecordingSettings.swift | 0 .../Sources/audio_waveforms}/Utils.swift | 0 .../audio_waveforms}/WaveformExtractor.swift | 1 + macos/.gitignore | 2 ++ macos/Classes/AudioWaveformsPlugin.h | 4 ---- macos/Classes/AudioWaveformsPlugin.m | 15 ------------ macos/audio_waveforms.podspec | 4 ++-- macos/audio_waveforms/Package.swift | 24 +++++++++++++++++++ .../AudioBufferProcessor.swift | 1 + .../audio_waveforms}/AudioPlayer.swift | 5 ++-- .../audio_waveforms}/AudioRecorder.swift | 1 + .../AudioWaveformsPlugin.swift} | 4 ++-- .../audio_waveforms}/RecordingSettings.swift | 0 .../Sources/audio_waveforms}/Utils.swift | 0 .../audio_waveforms}/WaveformExtractor.swift | 1 + pubspec.yaml | 2 +- 27 files changed, 80 insertions(+), 53 deletions(-) delete mode 100644 ios/Classes/AudioWaveformsPlugin.h delete mode 100644 ios/Classes/AudioWaveformsPlugin.m create mode 100644 ios/audio_waveforms/Package.swift rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/AudioPlayer.swift (97%) rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/AudioRecorder.swift (99%) rename ios/{Classes/SwiftAudioWaveformsPlugin.swift => audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift} (98%) rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/RecorderBytesStreamEngine.swift (99%) rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/RecordingSettings.swift (100%) rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/Utils.swift (100%) rename ios/{Classes => audio_waveforms/Sources/audio_waveforms}/WaveformExtractor.swift (99%) delete mode 100644 macos/Classes/AudioWaveformsPlugin.h delete mode 100644 macos/Classes/AudioWaveformsPlugin.m create mode 100644 macos/audio_waveforms/Package.swift rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/AudioBufferProcessor.swift (99%) rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/AudioPlayer.swift (98%) rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/AudioRecorder.swift (99%) rename macos/{Classes/SwiftAudioWaveformsPlugin.swift => audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift} (99%) rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/RecordingSettings.swift (100%) rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/Utils.swift (100%) rename macos/{Classes => audio_waveforms/Sources/audio_waveforms}/WaveformExtractor.swift (99%) diff --git a/.gitignore b/.gitignore index fde3aa4e..f3fc4a1c 100644 --- a/.gitignore +++ b/.gitignore @@ -62,4 +62,8 @@ ios/Frameworks/ ios/Runner.xcworkspace/xcshareddata/ example/ios/Flutter/flutter_export_environment.sh audio_waveforms.iml -pubspec.lock \ No newline at end of file +pubspec.lock + +# Swift Package Manager +**/.build/ +**/.swiftpm/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3beb9051..14b3745d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 2.1.0 (#unreleased) - Feature [#468](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/pull/468) - Add macOS support +- **BREAKING:** Feature [#492](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues/492) - Add Swift Package Manager support for iOS and macOS ## 2.0.2 diff --git a/ios/.gitignore b/ios/.gitignore index 0c885071..899d2d05 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -35,4 +35,6 @@ Icon? /Flutter/Generated.xcconfig /Flutter/ephemeral/ -/Flutter/flutter_export_environment.sh \ No newline at end of file +/Flutter/flutter_export_environment.sh +.build/ +.swiftpm/ diff --git a/ios/Classes/AudioWaveformsPlugin.h b/ios/Classes/AudioWaveformsPlugin.h deleted file mode 100644 index 5946602d..00000000 --- a/ios/Classes/AudioWaveformsPlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface AudioWaveformsPlugin : NSObject -@end diff --git a/ios/Classes/AudioWaveformsPlugin.m b/ios/Classes/AudioWaveformsPlugin.m deleted file mode 100644 index 92a1dc91..00000000 --- a/ios/Classes/AudioWaveformsPlugin.m +++ /dev/null @@ -1,15 +0,0 @@ -#import "AudioWaveformsPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "audio_waveforms-Swift.h" -#endif - -@implementation AudioWaveformsPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftAudioWaveformsPlugin registerWithRegistrar:registrar]; -} -@end diff --git a/ios/audio_waveforms.podspec b/ios/audio_waveforms.podspec index db48a16d..808f5915 100644 --- a/ios/audio_waveforms.podspec +++ b/ios/audio_waveforms.podspec @@ -13,9 +13,9 @@ A new Flutter project. s.license = { :file => '../LICENSE' } s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'audio_waveforms/Sources/audio_waveforms/**/*.swift' s.dependency 'Flutter' - s.platform = :ios, '8.0' + s.platform = :ios, '13.0' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/ios/audio_waveforms/Package.swift b/ios/audio_waveforms/Package.swift new file mode 100644 index 00000000..89c4e6c8 --- /dev/null +++ b/ios/audio_waveforms/Package.swift @@ -0,0 +1,24 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "audio_waveforms", + platforms: [ + .iOS("13.0"), + ], + products: [ + .library(name: "audio-waveforms", targets: ["audio_waveforms"]), + ], + dependencies: [ + .package(name: "FlutterFramework", path: "../FlutterFramework"), + ], + targets: [ + .target( + name: "audio_waveforms", + dependencies: [ + .product(name: "FlutterFramework", package: "FlutterFramework"), + ], + path: "Sources/audio_waveforms" + ), + ] +) diff --git a/ios/Classes/AudioPlayer.swift b/ios/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift similarity index 97% rename from ios/Classes/AudioPlayer.swift rename to ios/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift index f886574a..277d9f54 100644 --- a/ios/Classes/AudioPlayer.swift +++ b/ios/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift @@ -1,3 +1,4 @@ +import Flutter import Foundation import AVKit @@ -9,12 +10,12 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { private var player: AVAudioPlayer? private var finishMode:FinishMode = FinishMode.stop private var updateFrequency = 200 - var plugin: SwiftAudioWaveformsPlugin + var plugin: AudioWaveformsPlugin var playerKey: String var flutterChannel: FlutterMethodChannel - init(plugin: SwiftAudioWaveformsPlugin, playerKey: String, channel: FlutterMethodChannel) { + init(plugin: AudioWaveformsPlugin, playerKey: String, channel: FlutterMethodChannel) { self.plugin = plugin self.playerKey = playerKey flutterChannel = channel diff --git a/ios/Classes/AudioRecorder.swift b/ios/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift similarity index 99% rename from ios/Classes/AudioRecorder.swift rename to ios/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift index 64f2884d..2e98b4e8 100644 --- a/ios/Classes/AudioRecorder.swift +++ b/ios/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift @@ -1,3 +1,4 @@ +import Flutter import AVFoundation import Accelerate diff --git a/ios/Classes/SwiftAudioWaveformsPlugin.swift b/ios/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift similarity index 98% rename from ios/Classes/SwiftAudioWaveformsPlugin.swift rename to ios/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift index ddcf70f8..5f092f6e 100644 --- a/ios/Classes/SwiftAudioWaveformsPlugin.swift +++ b/ios/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift @@ -1,7 +1,7 @@ import Flutter import UIKit -public class SwiftAudioWaveformsPlugin: NSObject, FlutterPlugin { +public class AudioWaveformsPlugin: NSObject, FlutterPlugin { let audioRecorder: AudioRecorder var audioPlayers = [String: AudioPlayer]() @@ -20,7 +20,7 @@ public class SwiftAudioWaveformsPlugin: NSObject, FlutterPlugin { } public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: Constants.methodChannelName, binaryMessenger: registrar.messenger()) - let instance = SwiftAudioWaveformsPlugin(registrar: registrar, flutterChannel: channel) + let instance = AudioWaveformsPlugin(registrar: registrar, flutterChannel: channel) registrar.addMethodCallDelegate(instance, channel: channel) } diff --git a/ios/Classes/RecorderBytesStreamEngine.swift b/ios/audio_waveforms/Sources/audio_waveforms/RecorderBytesStreamEngine.swift similarity index 99% rename from ios/Classes/RecorderBytesStreamEngine.swift rename to ios/audio_waveforms/Sources/audio_waveforms/RecorderBytesStreamEngine.swift index 68841c73..758f789f 100644 --- a/ios/Classes/RecorderBytesStreamEngine.swift +++ b/ios/audio_waveforms/Sources/audio_waveforms/RecorderBytesStreamEngine.swift @@ -5,6 +5,7 @@ // Created by Ujas Majithiya on 10/04/25. // +import Flutter import Foundation import AVFAudio import Accelerate diff --git a/ios/Classes/RecordingSettings.swift b/ios/audio_waveforms/Sources/audio_waveforms/RecordingSettings.swift similarity index 100% rename from ios/Classes/RecordingSettings.swift rename to ios/audio_waveforms/Sources/audio_waveforms/RecordingSettings.swift diff --git a/ios/Classes/Utils.swift b/ios/audio_waveforms/Sources/audio_waveforms/Utils.swift similarity index 100% rename from ios/Classes/Utils.swift rename to ios/audio_waveforms/Sources/audio_waveforms/Utils.swift diff --git a/ios/Classes/WaveformExtractor.swift b/ios/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift similarity index 99% rename from ios/Classes/WaveformExtractor.swift rename to ios/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift index e922d5eb..dc1ea6ce 100644 --- a/ios/Classes/WaveformExtractor.swift +++ b/ios/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift @@ -1,3 +1,4 @@ +import Flutter import Accelerate import AVFoundation diff --git a/macos/.gitignore b/macos/.gitignore index 034771fc..899d2d05 100644 --- a/macos/.gitignore +++ b/macos/.gitignore @@ -36,3 +36,5 @@ Icon? /Flutter/Generated.xcconfig /Flutter/ephemeral/ /Flutter/flutter_export_environment.sh +.build/ +.swiftpm/ diff --git a/macos/Classes/AudioWaveformsPlugin.h b/macos/Classes/AudioWaveformsPlugin.h deleted file mode 100644 index 954b9564..00000000 --- a/macos/Classes/AudioWaveformsPlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface AudioWaveformsPlugin : NSObject -@end diff --git a/macos/Classes/AudioWaveformsPlugin.m b/macos/Classes/AudioWaveformsPlugin.m deleted file mode 100644 index 9c3b58df..00000000 --- a/macos/Classes/AudioWaveformsPlugin.m +++ /dev/null @@ -1,15 +0,0 @@ -#import "AudioWaveformsPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "audio_waveforms-Swift.h" -#endif - -@implementation AudioWaveformsPlugin -+ (void)registerWithRegistrar:(NSObject *)registrar { - [SwiftAudioWaveformsPlugin registerWithRegistrar:registrar]; -} -@end diff --git a/macos/audio_waveforms.podspec b/macos/audio_waveforms.podspec index c9637d76..7ac09714 100644 --- a/macos/audio_waveforms.podspec +++ b/macos/audio_waveforms.podspec @@ -13,9 +13,9 @@ A Flutter plugin that allows you to generate waveforms while recording audio or s.license = { :file => '../LICENSE' } s.author = { 'Simform Solutions' => 'developer@simform.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'audio_waveforms/Sources/audio_waveforms/**/*.swift' s.dependency 'FlutterMacOS' - s.platform = :osx, '10.14' + s.platform = :osx, '10.15' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' end diff --git a/macos/audio_waveforms/Package.swift b/macos/audio_waveforms/Package.swift new file mode 100644 index 00000000..8e2f4231 --- /dev/null +++ b/macos/audio_waveforms/Package.swift @@ -0,0 +1,24 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "audio_waveforms", + platforms: [ + .macOS("10.15"), + ], + products: [ + .library(name: "audio-waveforms", targets: ["audio_waveforms"]), + ], + dependencies: [ + .package(name: "FlutterFramework", path: "../FlutterFramework"), + ], + targets: [ + .target( + name: "audio_waveforms", + dependencies: [ + .product(name: "FlutterFramework", package: "FlutterFramework"), + ], + path: "Sources/audio_waveforms" + ), + ] +) diff --git a/macos/Classes/AudioBufferProcessor.swift b/macos/audio_waveforms/Sources/audio_waveforms/AudioBufferProcessor.swift similarity index 99% rename from macos/Classes/AudioBufferProcessor.swift rename to macos/audio_waveforms/Sources/audio_waveforms/AudioBufferProcessor.swift index 96139038..bf18a9a5 100644 --- a/macos/Classes/AudioBufferProcessor.swift +++ b/macos/audio_waveforms/Sources/audio_waveforms/AudioBufferProcessor.swift @@ -1,3 +1,4 @@ +import FlutterMacOS import AVFoundation import Accelerate diff --git a/macos/Classes/AudioPlayer.swift b/macos/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift similarity index 98% rename from macos/Classes/AudioPlayer.swift rename to macos/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift index 36f88d43..d2c98b31 100644 --- a/macos/Classes/AudioPlayer.swift +++ b/macos/audio_waveforms/Sources/audio_waveforms/AudioPlayer.swift @@ -1,3 +1,4 @@ +import FlutterMacOS import AVKit import Foundation @@ -10,7 +11,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { private var player: AVAudioPlayer? private var finishMode: FinishMode = FinishMode.stop private var updateFrequency = 200 - var plugin: SwiftAudioWaveformsPlugin + var plugin: AudioWaveformsPlugin var playerKey: String var flutterChannel: FlutterMethodChannel @@ -20,7 +21,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { /// - playerKey: Unique identifier for this player /// - channel: Flutter method channel for callbacks init( - plugin: SwiftAudioWaveformsPlugin, playerKey: String, + plugin: AudioWaveformsPlugin, playerKey: String, channel: FlutterMethodChannel ) { self.plugin = plugin diff --git a/macos/Classes/AudioRecorder.swift b/macos/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift similarity index 99% rename from macos/Classes/AudioRecorder.swift rename to macos/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift index 65497553..990c68fb 100644 --- a/macos/Classes/AudioRecorder.swift +++ b/macos/audio_waveforms/Sources/audio_waveforms/AudioRecorder.swift @@ -1,3 +1,4 @@ +import FlutterMacOS import AVFoundation import Accelerate diff --git a/macos/Classes/SwiftAudioWaveformsPlugin.swift b/macos/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift similarity index 99% rename from macos/Classes/SwiftAudioWaveformsPlugin.swift rename to macos/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift index 1106ed5e..17274742 100644 --- a/macos/Classes/SwiftAudioWaveformsPlugin.swift +++ b/macos/audio_waveforms/Sources/audio_waveforms/AudioWaveformsPlugin.swift @@ -3,7 +3,7 @@ import FlutterMacOS /// Main plugin class for audio_waveforms on macOS. /// Manages recording, playback, and waveform extraction functionality. -public class SwiftAudioWaveformsPlugin: NSObject, FlutterPlugin { +public class AudioWaveformsPlugin: NSObject, FlutterPlugin { let audioRecorder: AudioRecorder var audioPlayers = [String: AudioPlayer]() @@ -32,7 +32,7 @@ public class SwiftAudioWaveformsPlugin: NSObject, FlutterPlugin { let channel = FlutterMethodChannel( name: Constants.methodChannelName, binaryMessenger: registrar.messenger) - let instance = SwiftAudioWaveformsPlugin( + let instance = AudioWaveformsPlugin( registrar: registrar, flutterChannel: channel) registrar.addMethodCallDelegate(instance, channel: channel) } diff --git a/macos/Classes/RecordingSettings.swift b/macos/audio_waveforms/Sources/audio_waveforms/RecordingSettings.swift similarity index 100% rename from macos/Classes/RecordingSettings.swift rename to macos/audio_waveforms/Sources/audio_waveforms/RecordingSettings.swift diff --git a/macos/Classes/Utils.swift b/macos/audio_waveforms/Sources/audio_waveforms/Utils.swift similarity index 100% rename from macos/Classes/Utils.swift rename to macos/audio_waveforms/Sources/audio_waveforms/Utils.swift diff --git a/macos/Classes/WaveformExtractor.swift b/macos/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift similarity index 99% rename from macos/Classes/WaveformExtractor.swift rename to macos/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift index c2df70e4..a6111623 100644 --- a/macos/Classes/WaveformExtractor.swift +++ b/macos/audio_waveforms/Sources/audio_waveforms/WaveformExtractor.swift @@ -1,3 +1,4 @@ +import FlutterMacOS import AVFoundation import Accelerate diff --git a/pubspec.yaml b/pubspec.yaml index 2815ce3f..2706eba9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ issue_tracker: https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues environment: sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.10.0" + flutter: ">=3.24.0" dependencies: flutter: From 6a0ad798610e72a60379e84202e85276d869640a Mon Sep 17 00:00:00 2001 From: Marcelo Milhomem Date: Wed, 19 Aug 2026 15:21:23 +1000 Subject: [PATCH 2/2] chore: raise Flutter SDK constraint to 3.41 for SwiftPM The FlutterFramework Swift package is only generated by Flutter 3.41+, so the previous >=3.24.0 constraint still fails SwiftPM resolution. Co-authored-by: Cursor --- CHANGELOG.md | 2 +- example/pubspec.yaml | 2 +- pubspec.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14b3745d..4647fcd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 2.1.0 (#unreleased) - Feature [#468](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/pull/468) - Add macOS support -- **BREAKING:** Feature [#492](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues/492) - Add Swift Package Manager support for iOS and macOS +- **BREAKING:** Feature [#492](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues/492) - Add Swift Package Manager support for iOS and macOS. Requires Flutter `>=3.41.0` and Dart `^3.11.0` (`FlutterFramework` Swift package). ## 2.0.2 diff --git a/example/pubspec.yaml b/example/pubspec.yaml index f35aa59b..1db081a3 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -6,7 +6,7 @@ description: Demonstrates how to use the audio_waveforms plugin. publish_to: 'none' # Remove this line if you wish to publish to pub.dev environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.11.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/pubspec.yaml b/pubspec.yaml index 2706eba9..3754287e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/SimformSolutionsPvtLtd/audio_waveforms issue_tracker: https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues environment: - sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.24.0" + sdk: ^3.11.0 + flutter: ">=3.41.0" dependencies: flutter: