NightScoutViewController.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // SecondViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jon Fawcett on 6/1/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import UIKit
  9. import WebKit
  10. class NightscoutViewController: UIViewController {
  11. @IBOutlet weak var webView: WKWebView!
  12. override func viewDidLoad() {
  13. super.viewDidLoad()
  14. if UserDefaultsRepository.forceDarkMode.value {
  15. overrideUserInterfaceStyle = .dark
  16. }
  17. guard let myUrl = URL(string: UserDefaultsRepository.url.value) else { return }
  18. webView.configuration.preferences.javaScriptEnabled = true
  19. webView.navigationDelegate = self
  20. webView.uiDelegate = self
  21. webView.load(URLRequest(url: myUrl))
  22. let refreshControl = UIRefreshControl()
  23. refreshControl.addTarget(self, action: #selector(reloadWebView(_:)), for: .valueChanged)
  24. webView.scrollView.addSubview(refreshControl)
  25. self.webView.uiDelegate = self
  26. }
  27. @objc func reloadWebView(_ sender: UIRefreshControl) {
  28. webView.reload()
  29. sender.endRefreshing()
  30. }
  31. // this handles target=_blank links by opening them in the same view
  32. func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
  33. if let frame = navigationAction.targetFrame,
  34. frame.isMainFrame {
  35. return nil
  36. }
  37. // for _blank target or non-mainFrame target
  38. webView.load(navigationAction.request)
  39. return nil }
  40. }
  41. // MARK:- WKUIDelegate implementation
  42. extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
  43. func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
  44. let alertCtrl = UIAlertController(title: nil, message: message, preferredStyle: .alert)
  45. alertCtrl.addAction(UIAlertAction(title: "OK", style: .default) { action in
  46. completionHandler(true)
  47. })
  48. alertCtrl.addAction(UIAlertAction(title: "Cancel", style: .cancel) { action in
  49. completionHandler(false)
  50. })
  51. present(alertCtrl, animated: true)
  52. }
  53. func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  54. guard let _ = navigationAction.request.url else {
  55. decisionHandler(.cancel)
  56. return
  57. }
  58. decisionHandler(.allow)
  59. }
  60. func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
  61. guard let url = request.url else {
  62. return false
  63. }
  64. NSLog("Should start: \(url.absoluteString)")
  65. return true
  66. }
  67. func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
  68. if navigationAction.targetFrame == nil {
  69. webView.load(navigationAction.request)
  70. }
  71. return nil
  72. }
  73. }