nexo/packages/messaging_flutter/ios/Classes/NexoMessagingPlugin.swift
toki 68ccfb13fd feat: update iOS notification test and plugin implementation
- Update RunnerTests.swift with notification test cases
- Update NexoMessagingPlugin.swift with notification handling
- Update ios-notification-test-guide.md
2026-06-01 13:38:32 +09:00

97 lines
3.3 KiB
Swift

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
}
}