import Flutter import UIKit private enum NexoMessagingChannels { static let legacy = "nexo_messaging" static let events = "com.tokilabs.nexo.messaging/notifications" static let actions = "com.tokilabs.nexo.messaging/notification_actions" } private enum NexoMessagingKeys { static let deviceToken = "nexo.messaging.deviceToken" } public class NexoMessagingPlugin: NSObject, FlutterPlugin, FlutterStreamHandler { private var eventSink: FlutterEventSink? public static func register(with registrar: FlutterPluginRegistrar) { let instance = NexoMessagingPlugin() let messenger = registrar.messenger() let legacyChannel = FlutterMethodChannel( name: NexoMessagingChannels.legacy, binaryMessenger: messenger ) registrar.addMethodCallDelegate(instance, channel: legacyChannel) let actionChannel = FlutterMethodChannel( name: NexoMessagingChannels.actions, binaryMessenger: messenger ) registrar.addMethodCallDelegate(instance, channel: actionChannel) let eventChannel = FlutterEventChannel( name: NexoMessagingChannels.events, binaryMessenger: messenger ) eventChannel.setStreamHandler(instance) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "debugSendNativeEvent": guard let payload = call.arguments as? [String: Any] else { result(FlutterError(code: "INVALID_ARG", message: "event payload is null", details: nil)) return } eventSink?(payload) result(nil) case "saveDeviceToken": guard let token = argument("token", from: call) else { result(FlutterError(code: "INVALID_ARG", message: "token is null", details: nil)) return } UserDefaults.standard.set(token, forKey: NexoMessagingKeys.deviceToken) result(nil) case "getDeviceToken": result(UserDefaults.standard.string(forKey: NexoMessagingKeys.deviceToken)) case "setAuthToken": guard argument("serverUrl", from: call) != nil, argument("token", from: call) != nil else { result(FlutterError(code: "INVALID_ARG", message: "serverUrl or token is null", details: nil)) return } result(nil) case "setSigningKey": guard argument("serverUrl", from: call) != nil, argument("signingKey", from: call) != nil else { result(FlutterError(code: "INVALID_ARG", message: "serverUrl or signingKey is null", details: nil)) return } result(nil) case "clearAuthToken": guard argument("serverUrl", from: call) != nil else { result(FlutterError(code: "INVALID_ARG", message: "serverUrl is null", details: nil)) return } result(nil) case "getPlatformVersion": result("iOS " + UIDevice.current.systemVersion) default: result(FlutterMethodNotImplemented) } } public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { eventSink = events return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { eventSink = nil return nil } private func argument(_ name: String, from call: FlutterMethodCall) -> String? { guard let arguments = call.arguments as? [String: Any] else { return nil } return arguments[name] as? String } }