Flutter 하이브리드 앱 연동 가이드

개요


Flutter 하이브리드 앱 연동 가이드에 대한 내용입니다. flutter 에서 webview 를 사용하기 위해 몇몇 plugin 을 사용 할 수 있습니다. 해당 plugin 에 따른 사용방법이 다르기 때문에 javascript interface 를 활용하기 위한 method 를 제공합니다.


interface

var webInterface = Airbridge.createWebInterface(
      webToken: 'YOUR_WEB_TOKEN',
      postCommandFunction: (arg) {
        return """..."""; 
    });

YOUR_WEB_TOKEN 은 대시보드의 Settings > Tokens > 웹 SDK 토큰 에서 확인할 수 있습니다.

abstract class AirbridgeWebInterface {

  String get script;

  void handle(String message);
}

return 받은 AirbridgeWebInterface 를 통해 javascript interface 를 활용 할 수 있습니다.


이용가이드

아래는 많이 사용되는 plugin 2가지에 대한 연동에 대한 내용입니다.

webview_flutter 바로가기

@override
Widget build(BuildContext context) {
	WebViewController controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(Uri.parse('YOUR_WEB_URL'));
  setJavascriptInterface(controller);
  return WebViewWidget(controller: controller);
}

void setJavascriptInterface(WebViewController controller) {
  String initChannel = 'INIT_CHANNEL_NAME';
  String handleChannel = 'NATIVE_CHANNEL_NAME';

  var webInterface = Airbridge.createWebInterface(
    webToken: 'YOUR_WEB_TOKEN',
    postCommandFunction: (arg) {
    return 'window.$handleChannel.postMessage($arg);'; 
  });

  controller.addJavaScriptChannel(
    initChannel,
    onMessageReceived: (message) {
    controller.runJavaScript(webInterface.script);
  }
  );

  controller.addJavaScriptChannel(
    handleChannel,
    onMessageReceived: (message) {
    webInterface.handle(message.message);
  }
  );
}
  1. web interface 를 생성한다. postCommandFunction 에 app 으로 native channel로 메세지를 보내는 javascript 를 작성한다.
  2. WebViewWidget 초기화 시점 문제로 init channel 을 생성하여 초기화 시점에 callback 을 받도록 한다.
  3. native channel 을 생성한다.
  4. 초기화 시점에 controller.runJavaScript(webInterface.script); 호출 하여 javascript 를 inject 한다.
  5. native channel 로 도착한 메세지를 webInterface.handle(message.message); 을 통해 native SDK 로 전달한다.

flutter_inappwebview 바로가기

@override
Widget build(BuildContext context) {
  webInterface = Airbridge.createWebInterface(
    webToken: 'YOUR_WEB_TOKEN',
    postCommandFunction: (arg) {
    return """window.flutter_inappwebview.callHandler('postMessage', $arg);"""; 
  });

  return InAppWebView(
    key: webViewKey,
    initialUrlRequest: URLRequest(url: Uri.parse("YOUR_WEB_URL")),
    onWebViewCreated: (controller) async {
      controller.addJavaScriptHandler(handlerName: 'postMessage', callback: (args) {
        webInterface.handle(args[0]);
        return args;
      });
    },
    initialUserScripts: UnmodifiableListView<UserScript>([
      UserScript(
        source: webInterface.script, 
        injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START)
    ]),
  );
}
  1. web interface 를 생성한다. postCommandFunction 에 app 으로 native channel 로 메세지를 보내는 javascript 를 작성한다.
  2. InAppWebView 의 onWebViewCreatedcontroller.addJavaScriptHandler() 를 통해 native javascript handler 를 등록한다. callback 으로 webInterface.handle(message.message); 을 통해 native SDK 로 전달한다.
  3. InAppWebView 의 initialUserScripts 를 통해 webInterface.script); inject 한다. inject time 은 UserScriptInjectionTime.AT_DOCUMENT_START 로 시작시 적용하도록 한다.