Foggy day

[Flutter] MethodChannel - IOS 본문

Flutter/Flutter 기타

[Flutter] MethodChannel - IOS

jinhan38 2023. 8. 30. 11:52

이번 포스팅에서는 Flutter와 IOS Native가 통신하는 방법을 알아보겠습니다. Flutter는 MethodChannel을 사용해서 각 플랫폼과 통신할 수 있습니다. 메소드 채널은 비동기방식이며 FIFO 순서를 보장합니다.

 

 

1. Flutter -> IOS

2. IOS -> Flutter

 

 

 

1. Flutter -> IOS

먼저 할 것은 메소드채널 클래스를 만들어주고, 채널명과 호출할 함수의 이름을 정하는 것입니다.

예제에서 채널명은 iosMethodChannel이고, 함수명은 talk입니다. Dart에서 talk라는 함수를 호출하면 IOS에서 String 문자열을 리턴할 예정입니다. 

 

Dart

  static const platform = MethodChannel('iosMethodChannel');
  String value = "no data";
  
  ...
  
  Future<void> _callMethodChannel() async {
    value = await platform.invokeMethod('talk');
    setState(() {});
  }

 

Swift

FlutterMethodChannel을 생성하고 name을 넣어줬습니다.

핸들러를 보면 FlutterMethodCall 객체가 함수명과 arguments를 가지고 있습니다. 호출된 함수명에 맞게 처리를 해줄 수 있습니다. 그리고 결과 값을 리턴해주고 싶다면 FlutterResult 객체를 사용해서 데이터를 리턴할 수 있습니다. 

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

// Flutter -> IOS 호출
methodChannel.setMethodCallHandler({
    (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in

	// call.arguments
    switch call.method {
    	case "talk":
      	  result("call talk")
    	default:
      	  result("not find method")
    }
})

 

 

 

2. IOS -> Flutter

 

swift

ios에서 flutter로 함수를 호출할 때도 앞선 방식과 동일하게 methodChannel을 사용합니다. MethodChannel 클래스에 invokeMethod 함수가 있고, 함수명과 데이터를 전달할 수 있습니다. 예제에서는 타이머를 사용해서 2초에 한번 씩 int값을 증가시키고 데이터를 전달하고 있습니다. 

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

Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { timer in
    self.count += 1
    methodChannel.invokeMethod("countMethod", arguments: self.count)
}

 

Dart

Flutter 측면에서는 메소드 채널을 생성하고 핸들러를 추가해줍니다. MethodCall이라는 클래스를 통해 함수명과 arguments를 전달받을 수 있습니다. 

  static const platform = MethodChannel('iosMethodChannel');
  int count = 0;

  @override
  void initState() {
    super.initState();
    platform.setMethodCallHandler(nativeMethodCallHandler);
  }

  Future<dynamic> nativeMethodCallHandler(MethodCall methodCall) async {
    switch (methodCall.method) {
      case "countMethod":
        count = methodCall.arguments as int;
        break;
    }
    setState(() {});
  }

 

 

 

 

전체 소스코드

https://github.com/jinhan38/ios_method_channel