NightScoutViewController.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. var appStateController: AppStateController?
  13. override func viewDidLoad() {
  14. super.viewDidLoad()
  15. if UserDefaultsRepository.forceDarkMode.value {
  16. overrideUserInterfaceStyle = .dark
  17. }
  18. var url = UserDefaultsRepository.url.value
  19. let token = UserDefaultsRepository.token.value
  20. if token != "" {
  21. url = url + "?token=" + token
  22. }
  23. guard let myUrl = URL(string: url) else { return }
  24. webView.configuration.preferences.javaScriptEnabled = true
  25. webView.navigationDelegate = self
  26. webView.uiDelegate = self
  27. webView.load(URLRequest(url: myUrl))
  28. let refreshControl = UIRefreshControl()
  29. refreshControl.addTarget(self, action: #selector(reloadWebView(_:)), for: .valueChanged)
  30. webView.scrollView.addSubview(refreshControl)
  31. self.webView.uiDelegate = self
  32. }
  33. @objc func reloadWebView(_ sender: UIRefreshControl) {
  34. let alertController = UIAlertController(title: "Clear Web Cache", message: "Do you want to clear the web cache?\nNote: All Nightscout settings will be reverted to defaults!", preferredStyle: .alert)
  35. alertController.addAction(UIAlertAction(title: "Yes", style: .destructive) { _ in
  36. self.clearWebCache()
  37. self.webView.reload()
  38. sender.endRefreshing()
  39. })
  40. alertController.addAction(UIAlertAction(title: "No", style: .cancel) { _ in
  41. self.webView.reload()
  42. sender.endRefreshing()
  43. })
  44. present(alertController, animated: true, completion: nil)
  45. }
  46. // New code to clear web cache
  47. func clearWebCache() {
  48. let dataStore = WKWebsiteDataStore.default()
  49. let cacheTypes = Set([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
  50. let date = Date(timeIntervalSince1970: 0)
  51. dataStore.removeData(ofTypes: cacheTypes, modifiedSince: date) {
  52. print(“Web cache cleared.“)
  53. }
  54. }
  55. // this handles target=_blank links by opening them in the same view
  56. func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
  57. if let frame = navigationAction.targetFrame,
  58. frame.isMainFrame {
  59. return nil
  60. }
  61. // for _blank target or non-mainFrame target
  62. webView.load(navigationAction.request)
  63. return nil }
  64. }
  65. // MARK:- WKUIDelegate implementation
  66. extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
  67. func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
  68. let alertCtrl = UIAlertController(title: nil, message: message, preferredStyle: .alert)
  69. alertCtrl.addAction(UIAlertAction(title: "OK", style: .default) { action in
  70. completionHandler(true)
  71. })
  72. alertCtrl.addAction(UIAlertAction(title: "Cancel", style: .cancel) { action in
  73. completionHandler(false)
  74. })
  75. present(alertCtrl, animated: true)
  76. }
  77. func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  78. guard let _ = navigationAction.request.url else {
  79. decisionHandler(.cancel)
  80. return
  81. }
  82. decisionHandler(.allow)
  83. }
  84. func webView(_ webView: WKWebView, shouldStartLoadWith request: URLRequest) -> Bool {
  85. guard let url = request.url else {
  86. return false
  87. }
  88. NSLog("Should start: \(url.absoluteString)")
  89. return true
  90. }
  91. func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
  92. if navigationAction.targetFrame == nil {
  93. webView.load(navigationAction.request)
  94. }
  95. return nil
  96. }
  97. }