Foggy day
[Flutter] MethodChannel - IOS 본문
이번 포스팅에서는 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(() {});
}
전체 소스코드
'Flutter > Flutter 기타' 카테고리의 다른 글
[Flutter] CORS debug 모드에서 해제 처리 (0) | 2023.10.02 |
---|---|
[Dart] 위경도를 TM좌표 변환하기 (0) | 2023.08.31 |
[Flutter] IOS - no such module 'Flutter' (0) | 2023.08.30 |
[Flutter] EventChannel - Android (0) | 2023.08.29 |
[Flutter] MethodChannel - Android (0) | 2023.08.22 |