// // WkWebViewController.swift // GME Remit // // Created by Mac on 12/25/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import WebKit class WkWebViewController: UIViewController { var webView: WKWebView! var url: String? var headers: [KftcHeader]? weak var delegate: NewRegisterDelegate? var activityIndicator: UIActivityIndicatorView? let userContentController = WKUserContentController() @IBOutlet weak var closeButton: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() let preference = WKPreferences() preference.javaScriptEnabled = true preference.javaScriptCanOpenWindowsAutomatically = true let webConfiguration = WKWebViewConfiguration() userContentController.add(self, name: "test") webConfiguration.userContentController = userContentController webConfiguration.preferences = preference let webView = WKWebView.init(frame: view.frame, configuration: webConfiguration) webView.autoresizingMask = [.flexibleHeight, .flexibleWidth] webView.allowsBackForwardNavigationGestures = true webView.uiDelegate = self webView.navigationDelegate = self view = webView self.webView = webView setUserAgentForCloudCert(webView: self.webView) activityIndicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray) webView.addSubview(activityIndicator!) webView.isUserInteractionEnabled = true activityIndicator?.startAnimating() activityIndicator?.isHidden = false activityIndicator?.hidesWhenStopped = true webView.bringSubviewToFront(activityIndicator!) if let myURL = URL(string: url ?? "") { var myRequest = URLRequest(url: myURL) var header = [String: String]() headers?.forEach { model in header[model.key ?? ""] = model.value ?? "" } myRequest.allHTTPHeaderFields = header webView.load(myRequest) } closeButton.title = "penny_test_close_text".localized() if let count = navigationController?.viewControllers.count, count > 1 { navigationItem.leftBarButtonItem = nil } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) setupNormalNavigation() } @IBAction func touchCloseButton(_ sender: UIBarButtonItem) { dismiss(animated: true, completion: nil) } private func setUserAgentForCloudCert(webView: WKWebView) { webView.evaluateJavaScript("navigator.userAgent") { (userAgent, _) in guard let userAgent = userAgent as? String else { return } webView.customUserAgent = "\(userAgent) yessign/wv/i-Lzo41VQc1vdRqXJD5Cw4;1.0" } } @IBAction func touchCertTest(_ sender: Any) { if let myURL = URL(string: "https://testapi.openbanking.or.kr/oauth/2.0/authorize?auth_type=0&response_type=code&client_id=KxvHs6w5RLvByYmLrj3vCeD9Y9fWknzvLHetOhUE&edit_option=on&scope=inquiry&redirect_uri=https://www.kftc.or.kr&state=abcdefghijklmnopqrstuvwxyz123456&lang=kor") { let myRequest = URLRequest(url: myURL) webView.load(myRequest) } } } extension WkWebViewController: WKUIDelegate, WKNavigationDelegate { func webView( _ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures ) -> WKWebView? { if navigationAction.targetFrame == nil { var urlComponent = URLComponents() let url = navigationAction.request.url urlComponent.scheme = url?.scheme urlComponent.host = url?.host urlComponent.path = url?.path ?? "" if urlComponent.url?.absoluteString.range(of: "yessign.or.kr/open/html/v2/") != nil { let popupWebView = WKWebView( frame: CGRect(x: -1, y: -1, width: 1, height: 1), configuration: configuration ) popupWebView.autoresizingMask = [.flexibleWidth, .flexibleHeight] setUserAgentForCloudCert(webView: popupWebView) popupWebView.uiDelegate = self popupWebView.navigationDelegate = self view.addSubview(popupWebView) return popupWebView } } if navigationAction.request.url?.absoluteString.range(of: "yessign.or.kr") != nil { guard let url = navigationAction.request.url else { return nil } if UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url, options: [:], completionHandler: nil) } } return nil } func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { print("start") activityIndicator?.center = self.view.center activityIndicator?.startAnimating() } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { activityIndicator?.stopAnimating() self.navigationItem.title = webView.title } func webView( _ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void ) { let alertController = UIAlertController( title: message, message: nil, preferredStyle: UIAlertController.Style.alert ) alertController.addAction( UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel) { _ in completionHandler()} ) self.present(alertController, animated: true, completion: nil) } func webView( _ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void ) { guard let trust = challenge.protectionSpace.serverTrust else { return } let credential = URLCredential(trust: trust) completionHandler(.useCredential, credential) } } extension WkWebViewController: WKScriptMessageHandler { func userContentController( _ userContentController: WKUserContentController, didReceive message: WKScriptMessage ) { print(message.name) if let body = message.body as? String, body.lowercased().contains("successful") { guard let delegate = delegate else { self.alert(type: .success, message: "Auto-Debit account register is complete.") { self.dismiss(animated: true, completion: nil) } return } } else { alert(type: .error, message: "An error occurred.\nPlease contact customer service team.") { self.dismiss(animated: true) } } } }