NightScoutViewController.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // LoopFollow
  2. // NightScoutViewController.swift
  3. import UIKit
  4. import WebKit
  5. class NightscoutViewController: UIViewController {
  6. @IBOutlet var webView: WKWebView!
  7. override func viewDidLoad() {
  8. super.viewDidLoad()
  9. if Storage.shared.forceDarkMode.value {
  10. overrideUserInterfaceStyle = .dark
  11. }
  12. var url = Storage.shared.url.value
  13. let token = Storage.shared.token.value
  14. if token != "" {
  15. url = url + "?token=" + token
  16. }
  17. guard let myUrl = URL(string: url) else { return }
  18. let webpagePreferences = WKWebpagePreferences()
  19. webpagePreferences.allowsContentJavaScript = true
  20. webView.configuration.defaultWebpagePreferences = webpagePreferences
  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. }
  28. @objc func reloadWebView(_ sender: UIRefreshControl) {
  29. clearWebCache()
  30. webView.reload()
  31. sender.endRefreshing()
  32. }
  33. func clearWebCache() {
  34. let dataStore = WKWebsiteDataStore.default()
  35. let cacheTypes = Set([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
  36. let date = Date(timeIntervalSince1970: 0)
  37. dataStore.removeData(ofTypes: cacheTypes, modifiedSince: date) {
  38. print("Web cache cleared.")
  39. }
  40. }
  41. // this handles target=_blank links by opening them in the same view
  42. func webView(webView: WKWebView!, createWebViewWithConfiguration _: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures _: WKWindowFeatures!) -> WKWebView! {
  43. if let frame = navigationAction.targetFrame,
  44. frame.isMainFrame
  45. {
  46. return nil
  47. }
  48. // for _blank target or non-mainFrame target
  49. webView.load(navigationAction.request)
  50. return nil
  51. }
  52. }
  53. // MARK: - WKUIDelegate implementation
  54. extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
  55. func webView(_: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame _: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
  56. let alertCtrl = UIAlertController(title: nil, message: message, preferredStyle: .alert)
  57. alertCtrl.addAction(UIAlertAction(title: "OK", style: .default) { _ in
  58. completionHandler(true)
  59. })
  60. alertCtrl.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in
  61. completionHandler(false)
  62. })
  63. present(alertCtrl, animated: true)
  64. }
  65. func webView(_: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  66. guard let _ = navigationAction.request.url else {
  67. decisionHandler(.cancel)
  68. return
  69. }
  70. decisionHandler(.allow)
  71. }
  72. func webView(_: WKWebView, shouldStartLoadWith request: URLRequest) -> Bool {
  73. guard let url = request.url else {
  74. return false
  75. }
  76. NSLog("Should start: \(url.absoluteString)")
  77. return true
  78. }
  79. func webView(_ webView: WKWebView, createWebViewWith _: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures _: WKWindowFeatures) -> WKWebView? {
  80. if navigationAction.targetFrame == nil {
  81. webView.load(navigationAction.request)
  82. }
  83. return nil
  84. }
  85. func webView(_ webView: WKWebView, didFinish _: WKNavigation!) {
  86. let javascript = """
  87. var meta = document.querySelector('meta[name="viewport"]');
  88. if (meta) {
  89. meta.setAttribute('content', 'width=device-width, initial-scale=0.9, maximum-scale=5.0, user-scalable=yes');
  90. }
  91. """
  92. webView.evaluateJavaScript(javascript)
  93. }
  94. }