Flutter Dart - iOS 14 Event Channel Test

Опубликовано: 31 Март 2026
на канале: Lawrence Tsang
929
3

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