Implementación de Method Channel en iOS con Swift

Clase 14 de 29Curso de Integración Módulos Nativos iOS/Android para Flutter

Resumen

Crear un Method Channel en Flutter para iOS permite interactuar y obtener información específica del dispositivo, como el nivel de batería. Utilizando Swift en la carpeta Runner del proyecto iOS, podrás crear funciones que comuniquen Flutter con funcionalidades nativas del sistema operativo.

¿Cómo crear una función privada en Swift para obtener el nivel de batería?

Para obtener este dato específico, primero es necesario habilitar la monitorización de la batería del UI Device. Una función privada en Swift se define usando private func. Recibirá como parámetro un resultado que se obtiene de la comunicación con Flutter usando un escaping FlutterResult. Esta característica permite enviar datos al finalizar o durante la ejecución de la función.

private func getBatteryLevel(result: @escaping FlutterResult) {
    UIDevice.current.isBatteryMonitoringEnabled = true
    let batteryLevel = UIDevice.current.batteryLevel

    if batteryLevel >= 0 {
        result("\(Int(batteryLevel * 100))%")
    } else {
        result(FlutterError(code: "UNAVAILABLE", message: "No se pudo obtener el nivel de batería", details: nil))
    }
}

¿Cómo configurar el Method Channel en el AppDelegate?

En el archivo AppDelegate.swift es importante crear un controlador Flutter y una variable que almacene el canal de comunicación (battery channel). Este canal lleva el mismo nombre del que definiste anteriormente en Android y se conecta mediante el controlador creado:

let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "nativeCommunicator", binaryMessenger: controller.binaryMessenger)

Establecerás un MethodCallHandler para responder a las llamadas desde Flutter mediante condiciones. Si la llamada coincide con "getBattery", ejecutas la función previamente definida. De no ser así, retornas un error indicando que no fue implementado:

batteryChannel.setMethodCallHandler({
    (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
    if call.method == "getBatteryLevel" {
        self.getBatteryLevel(result: result)
    } else {
        result(FlutterMethodNotImplemented)
    }
})

¿En qué beneficia usar Method Channels con Flutter e iOS?

Este método otorga capacidad para utilizar funcionalidades específicas de sistemas operativos nativos como iOS desde Flutter. Así, se optimiza la interactividad y acceso a información del dispositivo, creando aplicaciones más completas y personalizadas.

Comienza explorando estas posibilidades integrando esta técnica y aprovecha al máximo la interacción entre Flutter e iOS. ¿Tienes dudas o algo adicional que te gustaría conocer sobre este tema?