NightScoutViewController.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // LoopFollow
  2. // NightScoutViewController.swift
  3. // Created by Jon Fawcett on 2020-06-05.
  4. import UIKit
  5. import WebKit
  6. class NightscoutViewController: UIViewController {
  7. @IBOutlet var webView: WKWebView!
  8. var appStateController: AppStateController?
  9. override func viewDidLoad() {
  10. super.viewDidLoad()
  11. if Storage.shared.forceDarkMode.value {
  12. overrideUserInterfaceStyle = .dark
  13. }
  14. var url = ObservableUserDefaults.shared.url.value
  15. let token = UserDefaultsRepository.token.value
  16. if token != "" {
  17. url = url + "?token=" + token
  18. }
  19. guard let myUrl = URL(string: url) else { return }
  20. webView.configuration.preferences.javaScriptEnabled = true
  21. webView.navigationDelegate = self
  22. webView.uiDelegate = self
  23. webView.load(URLRequest(url: myUrl))
  24. let refreshControl = UIRefreshControl()
  25. refreshControl.addTarget(self, action: #selector(reloadWebView(_:)), for: .valueChanged)
  26. webView.scrollView.addSubview(refreshControl)
  27. webView.uiDelegate = self
  28. }
  29. @objc func reloadWebView(_ sender: UIRefreshControl) {
  30. clearWebCache()
  31. webView.reload()
  32. sender.endRefreshing()
  33. }
  34. // New code to clear web cache
  35. func clearWebCache() {
  36. let dataStore = WKWebsiteDataStore.default()
  37. let cacheTypes = Set([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
  38. let date = Date(timeIntervalSince1970: 0)
  39. dataStore.removeData(ofTypes: cacheTypes, modifiedSince: date) {
  40. print("Web cache cleared.")
  41. }
  42. }
  43. // this handles target=_blank links by opening them in the same view
  44. func webView(webView: WKWebView!, createWebViewWithConfiguration _: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures _: WKWindowFeatures!) -> WKWebView! {
  45. if let frame = navigationAction.targetFrame,
  46. frame.isMainFrame
  47. {
  48. return nil
  49. }
  50. // for _blank target or non-mainFrame target
  51. webView.load(navigationAction.request)
  52. return nil
  53. }
  54. }
  55. // MARK: - WKUIDelegate implementation
  56. extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
  57. func webView(_: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame _: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
  58. let alertCtrl = UIAlertController(title: nil, message: message, preferredStyle: .alert)
  59. alertCtrl.addAction(UIAlertAction(title: "OK", style: .default) { _ in
  60. completionHandler(true)
  61. })
  62. alertCtrl.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in
  63. completionHandler(false)
  64. })
  65. present(alertCtrl, animated: true)
  66. }
  67. func webView(_: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  68. guard let _ = navigationAction.request.url else {
  69. decisionHandler(.cancel)
  70. return
  71. }
  72. decisionHandler(.allow)
  73. }
  74. func webView(_: WKWebView, shouldStartLoadWith request: URLRequest) -> Bool {
  75. guard let url = request.url else {
  76. return false
  77. }
  78. NSLog("Should start: \(url.absoluteString)")
  79. return true
  80. }
  81. func webView(_ webView: WKWebView, createWebViewWith _: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures _: WKWindowFeatures) -> WKWebView? {
  82. if navigationAction.targetFrame == nil {
  83. webView.load(navigationAction.request)
  84. }
  85. return nil
  86. }
  87. }