diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index dd0cf4e..2c6d5b9 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -19,7 +19,7 @@ class BoxListView: BaseView { var folderArr = [ Folder(name: "기본 폴더", color: .gray, webs: [ Web(name: "42 Intra", url: "https://profile.intra.42.fr/"), - Web(name: "42Where", url: "https://where42.kr/"), + Web(name: "42Where", url: "https://www.where42.kr/"), Web(name: "42Stat", url: "https://stat.42seoul.kr/"), Web(name: "집현전", url: "https://42library.kr/") ]), diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 3e3d4f3..5607379 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -32,8 +32,8 @@ class BoxListViewController: BaseNavigationBarViewController { extension BoxListViewController: BoxListViewDelegate { func didSelectWeb(at url: String, withName name: String) { - let viewController = WebViewController() - viewController.title = name + let viewController = PreloadedWebViewController() + viewController.title = name viewController.selectedWebsite = url navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift new file mode 100644 index 0000000..202a489 --- /dev/null +++ b/iBox/Sources/Presenter/Web/PreloadedWebView.swift @@ -0,0 +1,41 @@ +// +// PreloadedWebView.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import UIKit +import WebKit + +import SnapKit + +class PreloadedWebView: BaseView { + var selectedWebsite: String? { + didSet { + getWebView() + } + } + + private var webView: WKWebView? + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .systemBackground + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func getWebView() { + guard let selectedWebsite else { return } + webView = WebViewPreloader.shared.getWebView(for: URL(string: 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 new file mode 100644 index 0000000..c3872a0 --- /dev/null +++ b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift @@ -0,0 +1,33 @@ +// +// PreloadedWebViewController.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import UIKit + +class PreloadedWebViewController: BaseNavigationBarViewController { + var selectedWebsite: String? + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + navigationItem.largeTitleDisplayMode = .never + + guard let contentView = contentView as? PreloadedWebView else { return } + contentView.selectedWebsite = selectedWebsite + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + guard let selectedWebsite else { return } + WebViewPreloader.shared.resetWebView(for: URL(string: selectedWebsite)!) + } + + override func setupNavigationBar() { + setNavigationBarHidden(true) + } + +} diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 77d235c..f9f319e 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -18,6 +18,17 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.windowScene = windowScene window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 + + // 나중에 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) } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Utils/WebViewPreloader.swift new file mode 100644 index 0000000..d92b7e7 --- /dev/null +++ b/iBox/Sources/Utils/WebViewPreloader.swift @@ -0,0 +1,33 @@ +// +// WebViewPreloader.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import Foundation +import WebKit + +class WebViewPreloader { + static let shared = WebViewPreloader() + private var webViews: [URL: WKWebView] = [:] + + private init() {} + + func preload(urls: [URL]) { + for url in urls { + let webView = WKWebView() + webView.load(URLRequest(url: url)) + webViews[url] = webView + } + } + + func getWebView(for url: URL) -> WKWebView? { + return webViews[url] + } + + func resetWebView(for url: URL) { + webViews[url]?.load(URLRequest(url: url)) + } + +}