From 22300315a0897980420501a2963c1780da15871a Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 7 Mar 2024 16:06:41 +0900 Subject: [PATCH] feat: preload favoriteView --- Project.swift | 3 +- iBox/Sources/AppDelegate.swift | 7 +++ .../Presenter/BoxList/BoxListCell.swift | 1 + .../BoxList/BoxListViewController.swift | 3 +- .../Presenter/Favorite/FavoriteView.swift | 2 +- .../Presenter/Web/PreloadedWebView.swift | 46 ------------------ .../Web/PreloadedWebViewController.swift | 48 ------------------- iBox/Sources/Presenter/Web/WebView.swift | 34 ++++++++++--- .../Presenter/Web/WebViewController.swift | 2 +- iBox/Sources/SceneDelegate.swift | 17 +------ iBox/Sources/Utils/WebViewPreloader.swift | 23 +++++---- 11 files changed, 53 insertions(+), 133 deletions(-) delete mode 100644 iBox/Sources/Presenter/Web/PreloadedWebView.swift delete mode 100644 iBox/Sources/Presenter/Web/PreloadedWebViewController.swift diff --git a/Project.swift b/Project.swift index be119fe..dd16153 100644 --- a/Project.swift +++ b/Project.swift @@ -27,8 +27,9 @@ class iBoxFactory: ProjectFactory { private let appInfoPlist: [String: Plist.Value] = [ "ITSAppUsesNonExemptEncryption": false, + "CFBundleDisplayName": "iBox", "CFBundleName": "iBox", - "CFBundleShortVersionString": "1.2.1", + "CFBundleShortVersionString": "1.2.2", "CFBundleVersion": "1", "UILaunchStoryboardName": "LaunchScreen", "UIApplicationSceneManifest": [ diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 359a8e1..974c2f8 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -14,9 +14,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + preloadFavoriteWeb() versioningHandler.checkAppVersion() return true } + + private func preloadFavoriteWeb() { + let favorite = UserDefaultsManager.favorite + let favoriteUrl = favorite.url + WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) + } // MARK: UISceneSession Lifecycle diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index 0300221..5be0a7f 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -41,6 +41,7 @@ class BoxListCell: UITableViewCell { private func setupProperty() { backgroundColor = .tableViewBackgroundColor + selectionStyle = .none } private func setupHierarchy() { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 0972f1e..2ff4886 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -46,7 +46,8 @@ class BoxListViewController: BaseViewController, BaseViewController extension BoxListViewController: BoxListViewDelegate { func didSelectWeb(at url: URL, withName name: String) { - let viewController = PreloadedWebViewController(selectedWebsite: url) + let viewController = WebViewController() + viewController.selectedWebsite = url viewController.title = name navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Presenter/Favorite/FavoriteView.swift index f088c37..51f7cf3 100644 --- a/iBox/Sources/Presenter/Favorite/FavoriteView.swift +++ b/iBox/Sources/Presenter/Favorite/FavoriteView.swift @@ -10,7 +10,7 @@ import WebKit import SnapKit -class FavoriteView: PreloadedWebView { +class FavoriteView: UIView { private lazy var webView = WebViewPreloader.shared.getFavoriteView() diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift deleted file mode 100644 index fb260fb..0000000 --- a/iBox/Sources/Presenter/Web/PreloadedWebView.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// PreloadedWebView.swift -// iBox -// -// Created by 이지현 on 1/18/24. -// - -import UIKit -import WebKit - -import SnapKit - -class PreloadedWebView: UIView { - - var selectedWebsite: URL? { - didSet { - getWebView() - } - } - - // MARK: - UI Components - - private var webView: WKWebView? - - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - backgroundColor = .backgroundColor - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func getWebView() { - guard let selectedWebsite else { return } - webView = WebViewPreloader.shared.getWebView(for: selectedWebsite) - guard let webView else { return } - addSubview(webView) - webView.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - } - -} diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift deleted file mode 100644 index 9286992..0000000 --- a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// PreloadedWebViewController.swift -// iBox -// -// Created by 이지현 on 1/18/24. -// - -import UIKit - -class PreloadedWebViewController: BaseViewController, BaseViewControllerProtocol { - - var selectedWebsite: URL - - // MARK: - Initializer - - init(selectedWebsite: URL) { - self.selectedWebsite = selectedWebsite - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .backgroundColor - navigationItem.largeTitleDisplayMode = .never - - guard let contentView = contentView as? PreloadedWebView else { return } - contentView.selectedWebsite = selectedWebsite - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - WebViewPreloader.shared.resetWebView(for: selectedWebsite) - } - - // MARK: - BaseViewControllerProtocol - - func setupNavigationBar() { - setNavigationBarHidden(true) - } - -} diff --git a/iBox/Sources/Presenter/Web/WebView.swift b/iBox/Sources/Presenter/Web/WebView.swift index e306690..bfcb41e 100644 --- a/iBox/Sources/Presenter/Web/WebView.swift +++ b/iBox/Sources/Presenter/Web/WebView.swift @@ -11,16 +11,16 @@ import WebKit import SnapKit class WebView: UIView { - var selectedWebsite: String? { + var selectedWebsite: URL? { didSet { loadWebsite() } } - private let webView = WKWebView() -// .then { -// $0.scrollView.contentInsetAdjustmentBehavior = .always -// } + private let webView = WKWebView().then { + $0.isOpaque = false + $0.scrollView.contentInsetAdjustmentBehavior = .always + } override init(frame: CGRect) { super.init(frame: frame) @@ -33,6 +33,12 @@ class WebView: UIView { fatalError("init(coder:) has not been implemented") } + deinit { + webView.stopLoading() + webView.navigationDelegate = nil + webView.scrollView.delegate = nil + } + // MARK: - Setup Methods private func setupProperty() { @@ -51,7 +57,7 @@ class WebView: UIView { } private func loadWebsite() { - guard let website = selectedWebsite, let url = URL(string: website) else { return } + guard let url = selectedWebsite else { return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = true } @@ -59,5 +65,19 @@ class WebView: UIView { } extension WebView: WKNavigationDelegate { - +// func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { +// print("웹뷰 로딩 실패: \(error.localizedDescription)") +// } +// +// func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { +// print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") +// } +// +// func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { +// if let url = navigationAction.request.url { +// print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") +// } +// +// decisionHandler(.allow) +// } } diff --git a/iBox/Sources/Presenter/Web/WebViewController.swift b/iBox/Sources/Presenter/Web/WebViewController.swift index ed1fac4..9da3175 100644 --- a/iBox/Sources/Presenter/Web/WebViewController.swift +++ b/iBox/Sources/Presenter/Web/WebViewController.swift @@ -9,7 +9,7 @@ import UIKit class WebViewController: BaseViewController, BaseViewControllerProtocol { - var selectedWebsite: String? + var selectedWebsite: URL? // MARK: - Life Cycle diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 9059b7e..936c962 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -22,21 +22,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { insertDefaultDataIfNeeded() - // 나중에 userDefaults에 저장해두고 꺼내와서 preload하기 - let urlsToPreload = [ - URL(string: "https://profile.intra.42.fr/")!, - URL(string: "https://www.where42.kr/")!, - URL(string: "https://stat.42seoul.kr/")!, - URL(string: "https://42library.kr/")!, - URL(string: "https://cabi.42seoul.io/")!, - URL(string: "https://24hoursarenotenough.42seoul.kr/")! - ] - WebViewPreloader.shared.preload(urls: urlsToPreload) - - let favorite = UserDefaultsManager.favorite - let favoriteUrl = favorite.url - WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) - window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 @@ -53,7 +38,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { private func insertDefaultDataIfNeeded() { let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted if !isDefaultDataInserted { - var defaultData = [ + let defaultData = [ Folder(id: UUID(), name: "42 폴더", color: .gray, bookmarks: [ Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Utils/WebViewPreloader.swift index fc8b4a6..79082d6 100644 --- a/iBox/Sources/Utils/WebViewPreloader.swift +++ b/iBox/Sources/Utils/WebViewPreloader.swift @@ -10,41 +10,40 @@ import WebKit class WebViewPreloader { static let shared = WebViewPreloader() - private var webViews: [URL: WKWebView] = [:] + private var webView: WKWebView? private var favoriteView: (url: URL, webView: WKWebView)? private init() {} - func preload(urls: [URL]) { - for url in urls { - let webView = WKWebView() - webView.load(URLRequest(url: url)) - webViews[url] = webView - } + func preload(url: URL) { + let webView = WKWebView() + webView.isOpaque = false + webView.load(URLRequest(url: url)) + self.webView = webView } func preloadFavoriteView(url: URL) { let webView = WKWebView() + webView.isOpaque = false webView.load(URLRequest(url: url)) favoriteView = (url, webView) } - func getWebView(for url: URL) -> WKWebView? { - return webViews[url] + func getWebView() -> WKWebView? { + return webView } func getFavoriteView() -> WKWebView? { return favoriteView?.webView } - func resetWebView(for url: URL) { - webViews[url]?.load(URLRequest(url: url)) + func resetWebView() { + webView = nil } func resetFavoriteView() { guard let favoriteView else { return } favoriteView.webView.load(URLRequest(url: favoriteView.url)) } - }