WebView 사용하기 1편
WebView 사용하기 2편
이번 글에서는 IOS Native 코드인 swift를 사용해서 웹뷰를 오픈하는 방법에 대해서 작성해 보려고 한다.
IOS에서는 웹뷰를 사용할 때 UiWebView와 WkWebView 두 개의 웹뷰를 제공하고 있는데, 신규로 배포하는 앱에서 UiWebView를 사용하게 되면 리젝된다는 얘기가 있던데 이 부분은 확인을 해봐야 할 것이다.
참고로 Flutter에서 제공하는 웹뷰 라이브러리는 대체적으로 WkWebView를 사용하고 있다.
Swift 코드를 잘 모르기에 웹뷰를 띄우는 코드만 제공할 예정이다.
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
  
    GeneratedPluginRegistrant.register(with: self)
    let uiWebview = UiWebViewFactory()
    self.registrar(forPlugin: "WebviewUiPlugin")?.register(uiWebview, withId:"plugins/swift/uiWebview")
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
class UiWebViewFactory: NSObject, FlutterPlatformViewFactory {
    private var messenger: FlutterBinaryMessenger?
    override init(){
        super.init()
    }
    init(messenger: FlutterBinaryMessenger) {
        self.messenger = messenger
        super.init()
    }
    func create(
        withFrame frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?
    ) -> FlutterPlatformView {
        return FlutterUiWebView(
            frame: frame,
            viewIdentifier: viewId,
            arguments: args,
            binaryMessenger: messenger)
    }
}
class FlutterUiWebView: NSObject, FlutterPlatformView {
   private var _nativeWebView: UIWebView
   func view() -> UIView {
       return _nativeWebView
   }
   init(
       frame: CGRect,
       viewIdentifier viewId: Int64,
       arguments args: Any?,
       binaryMessenger messenger: FlutterBinaryMessenger?
   ) {
       _nativeWebView = UIWebView()
       _nativeWebView.loadRequest(NSURLRequest(url: NSURL(string: "https://youtube.com")! as URL) as URLRequest)
   }
}
import WebKit
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
  
    GeneratedPluginRegistrant.register(with: self)
    let wkWebview = WkWebViewFactory()
    self.registrar(forPlugin: "WebviewWkPlugin")?.register(wkWebview, withId:"plugins/swift/wkWebview")
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
class WkWebViewFactory: NSObject, FlutterPlatformViewFactory {
    private var messenger: FlutterBinaryMessenger?
    override init(){
        super.init()
    }
    init(messenger: FlutterBinaryMessenger) {
        self.messenger = messenger
        super.init()
    }
    func create(
        withFrame frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?
    ) -> FlutterPlatformView {
        return FlutterWkWebView(
            frame: frame,
            viewIdentifier: viewId,
            arguments: args,
            binaryMessenger: messenger)
    }
}
class FlutterWkWebView: NSObject, FlutterPlatformView {
    let webView = WKWebView()
    func view() -> UIView {
        return webView
    }
    init(
        frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?,
        binaryMessenger messenger: FlutterBinaryMessenger?
    ) {
        webView.load(NSURLRequest(url: NSURL(string: "https://youtube.com")! as URL) as URLRequest)
    }
}
Flutter에서 Native 뷰를 노출하는 방법은 동일하기에 WkWebView를 예제로 올리겠다.
return Scaffold(
      appBar: appBar(title: 'Webview With Swift(WKWebView)'),
      body: const UiKitView(
        viewType: 'plugins/swift/wkWebview',
        creationParamsCodec: StandardMessageCodec(),
      ),
    );


Swift <-> Flutter로 웹뷰를 오픈하는 방법에 대해서 살펴보았는데, 위에 제공된 예제가 가장 기본적인 구조인 것이고, 원하는 방식으로 수정하여 사용하시면 됩니다.