ios_audio_plugin project
New MacOS platform Channel Template is Broken
Old plugin still work, but XCode 12 show warning and errors.
iOS template is working,
==========================
Logic flow, and attempting to implement it.
1. AudioManager, send timeStamp, via Protocol
2. EventHandler, is the delegate, relay the timeStamp
3. Setup the receiver, Dart-Side main.dart.
==========================
3:/AndroidStudioProjects/ios_audio_plugin/example/lib/main.dart
class _MyAppState extends State*MyApp*
{
String _platformVersion = 'Unknown';
EventChannel eventChannel = const EventChannel("audio/event1");
void _onEvent(Object event)
{
setState(() {
_platformVersion = event;
});
}
void _onError(Object error) { print("err"); }
@override
void initState() {
super.initState();
initPlatformState();
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
}
-----------------------
2:/AndroidStudioProjects/ios_audio_plugin/ios/Classes/SwiftIosAudioPlugin.swift
Notes: External swift files, not processed by the Compiler,
Above file, contains all classes (AvAudioEngine Manager, Utilities, etc).
class MyEventHandler : NSObject, FlutterStreamHandler, AudioManagerProtocol
{
func relayTimeStamp(_ str : String)
{
_eventSink?(str) // do nothing, if NOT binded to a listener
}
private var _eventSink : FlutterEventSink?;
public func onListen(withArguments arguments: Any?,
eventSink: @escaping FlutterEventSink) -* FlutterError?
{
_eventSink = eventSink
return nil
}
public func onCancel(withArguments arguments: Any?) -* FlutterError?
{
_eventSink = nil;
return nil;
}
}
-------------------------
protocol AudioManagerProtocol
{
func relayTimeStamp(_ str : String)
}
class AudioManager: ObservableObject
{
var delegate : AudioManagerProtocol? = nil
........
1: AvAudioEngine's Timer Update Method
delegate?.relayTimeStamp(self.timeStamp)
=========================
Now, the hard part, no info/update.
Lot of trialError.
A: no need to change, Method Channel (not yet, may be next week)
/AndroidStudioProjects/ios_audio_plugin/lib/ios_audio_plugin.dart
B:/AndroidStudioProjects/ios_audio_plugin/ios/Classes/SwiftIosAudioPlugin.swift
Override the template's register method,
add to Xcode Runner project, a test .mp3 file
add classes init
public class SwiftIosAudioPlugin: NSObject, FlutterPlugin
{
var myEventHandler : MyEventHandler = MyEventHandler()
let audioMgr = AudioManager()
let fileURL = Bundle.main.url(forResource: "飘雪", withExtension: "mp3")
.....
add a custom .init method (SwiftIosAudioPlugin)
init(_ registrar: FlutterPluginRegistrar)
{
super.init()
let evChannel = FlutterEventChannel.init(name: "audio/event1", binaryMessenger: registrar.messenger());
// assign audioMgr's Delegate to Handler and sink msg to Dart Side
audioMgr.delegate = myEventHandler
evChannel.setStreamHandler( myEventHandler );
}
......
Modify the template's register method
public static func register(with registrar: FlutterPluginRegistrar)
{
let channel = FlutterMethodChannel(name: "ios_audio_plugin", binaryMessenger: registrar.messenger())
let instance = SwiftIosAudioPlugin(registrar)
registrar.addMethodCallDelegate(instance, channel: channel)
}
.....
testing music playback, by adding a line to the Method channel (_platformVersion thing)
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult)
{
audioMgr.startNewPlayerWith(thisURL: fileURL!, thisIndex: 0 )
result("iOS " + UIDevice.current.systemVersion)
}
.........
That is it, simple, if you know how, andOr in flutter's cook book.
Impossible, if you were, NOT a subscriber of
the "Trial and Error" principal.
==============
Resources:
AS 4.1
Xcode 12.1
MacOS 10.15.7
Flutter Dart Packages