diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.storyboard b/AgileWorks/AgileWorks/WebView/View/WebViewController.storyboard index e30f0eaf7833243797d2006fc69ab56d390779ab..f2dd256d708fcb5efef0208a53f4d15f653bb5cb 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.storyboard +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.storyboard @@ -4,6 +4,7 @@ + @@ -16,10 +17,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -48,6 +109,9 @@ + + + diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 2c5f4acee82a24bd15b8ed72b2cf722644f5965b..b606abc761145f169ff7930ed7543a2ecd35277b 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -6,11 +6,15 @@ // Copyright © 2021 ATLED CORP. All rights reserved. // import FloatingPanel +import Network import UIKit import WebKit class WebViewController: UIViewController { - @IBOutlet private var webView: UIView! + @IBOutlet private var formView: UIView! + @IBOutlet private var disablingView: UIView! + @IBOutlet private var disconnectLabel: UILabel! + @IBOutlet private var checkConnectButton: UIButton! var mainWebView: WKWebView! // WebView 表示用 JSESSIONID var sessionId: String! @@ -22,6 +26,9 @@ class WebViewController: UIViewController { let kCustomUserAgent = "AwMobileApp Safari/605.1.15" var messageHandler: WebViewScriptMessageHandler! var refreshControl: UIRefreshControl! + private let monitor = NWPathMonitor() + private let queue = DispatchQueue(label: "jp.atled.agileworks") + var isShowDoc = false // Title を設定する URL を定義 let urlToTitle: [String: String] = [ @@ -37,6 +44,10 @@ class WebViewController: UIViewController { self.subWebViewStack.eventDelegate = self self.updateSession(isInit: true) + + // ネットワークオフラインView関連セットアップ + self.setDisconnectView() + self.startNetworkMonitor() } override func viewWillAppear(_ animated: Bool) { @@ -57,8 +68,7 @@ class WebViewController: UIViewController { let configuration = WKWebViewConfiguration() configuration.userContentController = userContentController configuration.applicationNameForUserAgent = kCustomUserAgent - mainWebView = WKWebView(frame: view.frame, configuration: configuration) - //mainWebView = WKWebView(frame: view.frame) + mainWebView = WKWebView(frame: self.formView.frame, configuration: configuration) // スクロール設定 mainWebView.scrollView.bounces = true @@ -82,10 +92,9 @@ class WebViewController: UIViewController { tapWebView.numberOfTapsRequired = 1 tapWebView.delegate = self self.mainWebView.addGestureRecognizer(tapWebView) - view.addSubview(mainWebView) - // AutoLayout - //mainWebView.translatesAutoresizingMaskIntoConstraints = false - //mainWebView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true + // 回転時リサイズ設定 + mainWebView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.formView.addSubview(mainWebView) } // WebView ロード処理 @@ -185,6 +194,39 @@ class WebViewController: UIViewController { } } + // オフラインViewセットアップ + func setDisconnectView() { + disconnectLabel.text = NSLocalizedString("DisconnectNetworkLabel", comment: "") + disconnectLabel.textAlignment = .center + disconnectLabel.textColor = UIColor.red + checkConnectButton.setTitle(NSLocalizedString("CheckConnectButton", comment: ""), for: .normal) + } + + // ネットワークモニタリング開始 + func startNetworkMonitor() { + // ネットワーク変更時 handler + monitor.pathUpdateHandler = { path in + // ネットワーク接続時 + if path.status == .satisfied { + // オフラインView非表示 + DispatchQueue.main.async { + self.disablingView.isHidden = true + } + // ネットワーク非接続時 + } else { + // 書類表示時 + if self.isShowDoc { + // オフラインView表示 + DispatchQueue.main.async { + self.disablingView.isHidden = false + self.checkConnectButton.isEnabled = true + } + } + } + } + // モニタリングスタート + monitor.start(queue: queue) + } // ページ変更を受信 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { switch keyPath { @@ -206,11 +248,13 @@ class WebViewController: UIViewController { } */ // 画面リロードチェック + self.isShowDoc = false for key in self.reloadUrl { if urlString.contains(key) { print("webview reload") // リロード self.mainWebView.reload() + self.isShowDoc = true break } } @@ -231,6 +275,30 @@ class WebViewController: UIViewController { // クルクルを止める self.refreshControl.endRefreshing() } + + // 接続確認ボタンタップ処理 + @IBAction private func checkConnectTapped() { + // 2重タップ防止 + if self.checkConnectButton.isEnabled == false { + return + } + self.checkConnectButton.isEnabled = false + // ネットワーク接続チェック + if isOnline() { + // オフラインView非表示 + DispatchQueue.main.async { + self.disablingView.isHidden = true + } + } else { + // 接続確認ボタン活性 + self.checkConnectButton.isEnabled = true + } + } + + // ネットワークオンラインチェック + private func isOnline() -> Bool { + return self.monitor.currentPath.status == .satisfied + } } extension WebViewController: WKUIDelegate { diff --git a/AgileWorks/AgileWorks/en.lproj/Localizable.strings b/AgileWorks/AgileWorks/en.lproj/Localizable.strings index cdf459dc5a39765ea97286572743f0bfeff467e1..ef9dda8df1bb502618890d66bdf3153baa67bc6f 100644 --- a/AgileWorks/AgileWorks/en.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/en.lproj/Localizable.strings @@ -27,6 +27,7 @@ "WorkTitle" = "仕事"; "DocumentsTitle" = "書類作成"; "SearchTitle" = "検索"; +"CheckConnectButton" = "接続確認"; // Approval "ApprovalTitle" = "承認一覧"; @@ -76,6 +77,7 @@ "RefreshTokenUpdateError" = "AgileWorksサーバへアクセスするためのトークンの更新が行えませんでした。\n再ログインする必要があります。"; // Network Error Message +"DisconnectNetworkLabel" = "現在オフラインです。\nオフライン中の操作はお控えください。"; "UnknownNetworkError" = "ネットワークエラーが発生しました"; "NotConnectNetworkError" = "インターネットにアクセスするにはモバイルデータ通信をオンにするかWi-Fiを利用してください"; "TimedOutNetworkError" = "インターネットに接続できません\nしばらく経ってから再度おためしください"; diff --git a/AgileWorks/AgileWorks/ja.lproj/Localizable.strings b/AgileWorks/AgileWorks/ja.lproj/Localizable.strings index ce21a250746a45c9f0e5edd51d8ca89693c52f11..c827bbf49363bdf9838e4cf96a5ce979da06a1ef 100644 --- a/AgileWorks/AgileWorks/ja.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/ja.lproj/Localizable.strings @@ -27,6 +27,7 @@ "WorkTitle" = "仕事"; "DocumentsTitle" = "書類作成"; "SearchTitle" = "検索"; +"CheckConnectButton" = "接続確認"; // Approval "ApprovalTitle" = "承認一覧"; @@ -76,6 +77,7 @@ "RefreshTokenUpdateError" = "AgileWorksサーバへアクセスするためのトークンの更新が行えませんでした。\n再ログインする必要があります。"; // Network Error Message +"DisconnectNetworkLabel" = "現在オフラインです。\nオフライン中の操作はお控えください。"; "UnknownNetworkError" = "ネットワークエラーが発生しました"; "NotConnectNetworkError" = "インターネットにアクセスするにはモバイルデータ通信をオンにするかWi-Fiを利用してください"; "TimedOutNetworkError" = "インターネットに接続できません\nしばらく経ってから再度おためしください";