ExtraWebViewController.swift 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. //
  2. // ExtraWebViewControllerSwift.swift
  3. // MCPlus
  4. //
  5. // Created by seo ha on 15/02/2019.
  6. // Copyright © 2019 KangSH. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. import WebKit
  11. class ExtraWebViewController: UIViewController {
  12. @IBOutlet weak var loadingIndicator: UIActivityIndicatorView!
  13. @IBOutlet weak var webView:WKWebView!{
  14. didSet{
  15. webView.uiDelegate = self
  16. webView.navigationDelegate = self
  17. webView.configuration.userContentController.add(self, name: "mCarePlus")
  18. webView.configuration.suppressesIncrementalRendering = false // 데이터를 모두 받아야만 화면이 보여지게 하는 옵션
  19. var scriptContent = "var meta = document.createElement('meta');"
  20. scriptContent += "meta.name='viewport';"
  21. scriptContent += "meta.content='width=device-width';"
  22. scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);"
  23. webView.evaluateJavaScript(scriptContent, completionHandler: nil)
  24. webView.evaluateJavaScript("navigator.userAgent") { [weak webView](result, error) in
  25. if let userAgent = result as? String{
  26. webView?.customUserAgent = userAgent.appending("/mCarePlus")
  27. }
  28. }
  29. guard let url = URL(string: url ?? "") else {
  30. return
  31. }
  32. let request = URLRequest(url: url)
  33. webView.load(request)
  34. webView.isUserInteractionEnabled = true
  35. webView.scrollView.bounces = true
  36. webView.scrollView.isScrollEnabled = true
  37. }
  38. }
  39. @IBOutlet weak var menuView: UIView!
  40. @IBOutlet weak var backwardButton: UIView!{
  41. didSet{
  42. backwardButton.addTapGestureRecognizer(action: self.backAction)
  43. }
  44. }
  45. @IBOutlet weak var forwardButton: UIView!{
  46. didSet{
  47. forwardButton.addTapGestureRecognizer(action: self.fowardAction)
  48. }
  49. }
  50. @IBOutlet weak var refreshButton: UIView!{
  51. didSet{
  52. refreshButton.addTapGestureRecognizer(action: self.refreshAction)
  53. }
  54. }
  55. @IBOutlet weak var closeButton: UIView!{
  56. didSet{
  57. closeButton.addTapGestureRecognizer(action: self.closeAction)
  58. }
  59. }
  60. var url:String?
  61. }
  62. extension ExtraWebViewController{
  63. override func viewDidLoad() {
  64. super.viewDidLoad()
  65. webView.frame = self.view.frame
  66. }
  67. override func didReceiveMemoryWarning() {
  68. super.didReceiveMemoryWarning()
  69. }
  70. func backAction(){
  71. if self.webView.canGoBack {
  72. self.webView.goBack()
  73. }
  74. }
  75. func fowardAction(){
  76. if self.webView.canGoForward{
  77. self.webView.goForward()
  78. }
  79. }
  80. func refreshAction(){
  81. self.webView.reload()
  82. }
  83. func closeAction(){
  84. self.dismiss(animated: true, completion: nil)
  85. }
  86. }
  87. extension ExtraWebViewController:WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler{
  88. func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping ((WKNavigationActionPolicy) -> Void)) {
  89. let request = navigationAction.request
  90. guard let url = request.url else {
  91. return
  92. }
  93. let absoluteString = url.absoluteString
  94. switch absoluteString {
  95. //메일
  96. case let variable where variable.hasPrefix("mailto:"):
  97. fallthrough
  98. //전화
  99. case let variable where variable.hasPrefix("tel:"):
  100. fallthrough
  101. //아이튠즈
  102. case let variable where variable.hasPrefix("https://itunes.apple.com/"):
  103. fallthrough
  104. //스토리링크
  105. case let variable where variable.hasPrefix("storylink://"):
  106. UIApplication.shared.open(url)
  107. decisionHandler(.cancel)
  108. //일반 웹호출
  109. case let variable where variable.hasPrefix("http://"):
  110. fallthrough
  111. case let variable where variable.hasPrefix("https://"):
  112. decisionHandler(.allow)
  113. default:
  114. decisionHandler(.cancel)
  115. }
  116. //
  117. // self.backward.tintColor = webView.canGoBack ? UIColor.white : UIColor.clear
  118. // self.backward.isAccessibilityElement = webView.canGoBack
  119. //
  120. // self.forward.tintColor = webView.canGoForward ? UIColor.white : UIColor.clear
  121. // self.forward.isAccessibilityElement = webView.canGoForward
  122. }
  123. func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
  124. if let urlResponse = navigationResponse.response as? HTTPURLResponse,
  125. let url = urlResponse.url,
  126. let allHeaderFields = urlResponse.allHeaderFields as? [String : String] {
  127. let cookies = HTTPCookie.cookies(withResponseHeaderFields: allHeaderFields, for: url)
  128. HTTPCookieStorage.shared.setCookies(cookies , for: url, mainDocumentURL: nil)
  129. decisionHandler(.allow)
  130. }
  131. }
  132. func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
  133. completionHandler: @escaping () -> Void) {
  134. self.showAlert("", message, "확인", nil, { (action) in
  135. completionHandler()
  136. })
  137. }
  138. func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
  139. completionHandler: @escaping (Bool) -> Void) {
  140. self.showAlert("", message, "확인", "취소", { (action) in
  141. completionHandler(true)
  142. },{ (action) in
  143. completionHandler(false)
  144. })
  145. }
  146. func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo,
  147. completionHandler: @escaping (String?) -> Void) {
  148. let alertController = UIAlertController(title: "", message: prompt, preferredStyle: .alert)
  149. alertController.addTextField { (textField) in
  150. textField.text = defaultText
  151. }
  152. alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
  153. if let text = alertController.textFields?.first?.text {
  154. completionHandler(text)
  155. } else {
  156. completionHandler(defaultText)
  157. }
  158. }))
  159. alertController.addAction(UIAlertAction(title: "취소", style: .default, handler: { (action) in
  160. completionHandler(nil)
  161. }))
  162. self.present(alertController, animated: true, completion: nil)
  163. }
  164. // func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
  165. // let userController = WKUserContentController()
  166. //
  167. // configuration.preferences.javaScriptCanOpenWindowsAutomatically = true
  168. // configuration.userContentController = userController
  169. //
  170. // let newWebView:WKWebView = {
  171. // let webView = WKWebView(frame: webView.frame, configuration: configuration)
  172. // webView.uiDelegate = self
  173. // webView.navigationDelegate = self
  174. // webView.frame.origin.y = 0
  175. // webView.configuration.userContentController.add(self, name: "mCarePlus")
  176. // webView.evaluateJavaScript("navigator.userAgent") { [weak webView](result, error) in
  177. // if let userAgent = result as? String{
  178. // webView?.customUserAgent = userAgent.appending("/mCarePlus")
  179. // }
  180. // }
  181. //
  182. // return webView
  183. // }()
  184. //
  185. // let button:UIButton = {
  186. // let button = UIButton(type: .system)
  187. // button.isHidden = true
  188. // button.frame = CGRect(x:(webView.frame.size.width) - 30, y:0, width: 30, height: 30)
  189. // button.backgroundColor = UIColor.black
  190. // button.layer.cornerRadius = 15
  191. // button.setTitle("X", for: .normal)
  192. // button.addTapGestureRecognizer(action: deleteSubWebView)
  193. // return button
  194. // }()
  195. //
  196. // webView.addSubview(newWebView)
  197. // webView.addSubview(button)
  198. //
  199. // return newWebView
  200. // }
  201. //
  202. // func deleteSubWebView(){
  203. // for view in webView.subviews{
  204. // view.removeFromSuperview()
  205. // }
  206. // }
  207. //
  208. // func webViewDidClose(_ webView: WKWebView) {
  209. // for view in webView.subviews{
  210. // view.removeFromSuperview()
  211. // }
  212. // webView.removeFromSuperview()
  213. // }
  214. func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!){
  215. self.loadingIndicator.startAnimating()
  216. UIApplication.shared.isNetworkActivityIndicatorVisible = true
  217. }
  218. public func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
  219. // 중복적으로 리로드가 일어나지 않도록 처리 필요.
  220. webView.reload()
  221. }
  222. func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
  223. self.loadingIndicator.stopAnimating()
  224. UIApplication.shared.isNetworkActivityIndicatorVisible = false
  225. }
  226. func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  227. }
  228. }