Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

60 lignes
1.7 KiB

  1. //
  2. // MessageChannelPlugin.swift
  3. // webview_universal
  4. //
  5. // Created by Bin Yang on 2021/11/19.
  6. //
  7. import FlutterMacOS
  8. import Foundation
  9. public class ClientMessageChannelPlugin: NSObject, FlutterPlugin {
  10. public init(methodChannel: FlutterMethodChannel) {
  11. self.methodChannel = methodChannel
  12. super.init()
  13. }
  14. public static func register(with registrar: FlutterPluginRegistrar) {
  15. let channel = FlutterMethodChannel(name: "webview_message/client_channel", binaryMessenger: registrar.messenger)
  16. let instance = ClientMessageChannelPlugin(methodChannel: channel)
  17. registrar.addMethodCallDelegate(instance, channel: channel)
  18. ServerMessageChannel.shared.addClient(client: instance)
  19. }
  20. private let methodChannel: FlutterMethodChannel
  21. public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
  22. ServerMessageChannel.shared.dispatchMethodCall(call: call, from: self)
  23. // this is a boardcast, so we complete this with sucess.
  24. result(nil)
  25. }
  26. fileprivate func invokeMethod(_ call: FlutterMethodCall) {
  27. methodChannel.invokeMethod(call.method, arguments: call.arguments)
  28. }
  29. }
  30. class ServerMessageChannel {
  31. static let shared: ServerMessageChannel = ServerMessageChannel()
  32. private var clients: [ClientMessageChannelPlugin] = []
  33. func addClient(client: ClientMessageChannelPlugin) {
  34. clients.append(client)
  35. }
  36. func removeClient(client: ClientMessageChannelPlugin) {
  37. if let index = clients.firstIndex(of: client) {
  38. clients.remove(at: index)
  39. }
  40. }
  41. func dispatchMethodCall(call: FlutterMethodCall, from clientFrom: ClientMessageChannelPlugin) {
  42. for client in clients {
  43. if client != clientFrom {
  44. client.invokeMethod(call)
  45. }
  46. }
  47. }
  48. }