Configuración de MethodChannel en Swift para Flutter y iOS

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

Resumen

Crear una comunicación efectiva entre Flutter y iOS implica configurar adecuadamente un MethodChannel en Swift. Esta configuración permite acceder a información del sistema operativo, como el nivel de batería, directamente desde tu aplicación Flutter.

¿Cómo configurar el MethodChannel en Swift para iOS?

Para establecer esta comunicación, debes trabajarlo directamente en el archivo AppDelegate.swift. Asegúrate de importar primero las bibliotecas necesarias:

  • import Flutter
  • import UIKit

Luego, genera la funcionalidad que conectará con el canal usando FlutterMethodChannel. Es fundamental seguir los mismos parámetros establecidos en la versión de Android para mantener coherencia en ambas plataformas.

¿Cómo obtener el nivel de batería usando Swift?

Primero, crea una funcionalidad privada llamada GetBattery. Dentro de esta función:

  • Accede al UIDevice actual (UIDevice.current).
  • Activa el monitoreo de batería con isBatteryMonitoringEnabled establecida en true.
  • Captura el nivel de batería usando la propiedad .batteryLevel.

Debes tener en cuenta convertir el valor del nivel de batería a un entero y multiplicarlo por 100 para presentarlo como porcentaje:

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

¿Cómo conectar esta funcionalidad al MethodChannel en tu AppDelegate?

Posteriormente, dentro del método application, crea y configura:

  • Un controlador FlutterViewController ingresando por medio de window.rootViewController.
  • El FlutterMethodChannel, que actuará como canal de comunicación utilizando un nombre consistente entre iOS y Android.

Además, establece la comunicación con setMethodCallHandler para gestionar llamadas del canal:

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

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

Pensar en la interoperabilidad entre Flutter y Swift es clave para lograr aplicaciones funcionales y multiplataforma. ¿Listo para crear interfaces que interactúen directamente con este método?