๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
UIUX

[HIG] Web views๐ŸŒ

by yangsubinn 2022. 11. 4.

Human Interface Guidelines์— ๋Œ€ํ•œ ํ•ด์„๊ณผ ์ฃผ๊ด€์ ์ธ ์‚ฌ๋ก€ ๋ถ„์„์„ ์ถ”๊ฐ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿ“Web views

Web view๋Š” HTML์ด๋‚˜ ์›น์‚ฌ์ดํŠธ์™€ ๊ฐ™์€ ํ’๋ถ€ํ•œ ์›น ์ปจํ…์ธ ๋ฅผ ์•ฑ ๋‚ด์—์„œ ์ง์ ‘์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

๋ฉ”์ผ์—์„œ๋Š” ๋ฉ”์„ธ์ง€ ๋‚ด์˜ HTML ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด web view๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Best practices

Enable forward and back navigation when appropriate

Web view์—์„œ๋Š” ์•ž๋’ค ํƒ์ƒ‰์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ด ํ–‰๋™์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

WKWebView ๋””ํดํŠธ (๊ธฐ๋ณธ์ ์œผ๋กœ ์•ž๋’ค ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ์ปจํŠธ๋กคX)

์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ์›น๋ทฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์•ž๋’ค ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ 

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(์™ผ)์ธ์Šคํƒ€๊ทธ๋žจ, (์˜ค)์ง€๊ทธ์žฌ๊ทธ

 

Avoid using a web view to build a web browser

Web view๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์˜ ํ๋ฆ„์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ž ์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ,

์‚ฌ์šฉ์ž๊ฐ€ ์›น์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฃผ์š” ์ˆ˜๋‹จ์€ Safari์ž…๋‹ˆ๋‹ค.

์•ฑ์—์„œ Safari์˜ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ๋ถˆํ•„์š”ํ•˜๊ณ  ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“์‹ค์ „ webView

iOS ์—์„œ ์›น์„ ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•

  1. WebView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ๋‚ด๋ถ€์— ํ‘œ์‹œ
  2. ์•ฑ์—์„œ safari๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น URL ์—ด๊ธฐ
  3. SFSafariViewController๋กœ ์•ฑ ์•ˆ์—์„œ SafariView๋กœ ์—ด๊ธฐ

์•„๋ž˜ ์˜ˆ์‹œ๋Š” 1๋ฒˆ ๋ฐฉ๋ฒ•์ธ WKWebView๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ์ด๊ณ , ๋‚˜๋จธ์ง€ ๋‘ ๋ฐฉ๋ฒ•์€ ๊นƒํ—ˆ๋ธŒ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”

 

1๏ธโƒฃ ๊ธฐ๋ณธ ๊ทธ๋ƒฅ web view

1. http ์ ‘๊ทผ ํ—ˆ์šฉ

xcode์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ http๋ฅผ ๋ง‰๊ณ  https ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

http๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋”ฐ๋กœ info.plist์—์„œ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Info.plist → Information Property List → App Transport Security Settings → Allow Arbitrary Loads

๊ธฐ๋ณธ ์„ค์ •์€ NO
YES๋กœ ๋ฐ”๊ฟ”์ฃผ์„ธ์šœ

2. WKWebView ์ƒ์„ฑ

import WebKit

...

private let webView = WKWebView() // ๋ ˆ์ด์•„์›ƒ์€ Snapkit์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค.

...

private func setLayout() {
        self.view.addSubview(webView)
//        self.view.addSubview(toolBar)
        
//        toolBar.snp.makeConstraints { make in
//            make.leading.trailing.equalToSuperview()
//            make.bottom.equalTo(self.view.safeAreaLayoutGuide)
//            make.height.equalTo(44)
//        }
        
        webView.snp.makeConstraints { make in
						make.edges.equalToSuperview()
//            make.top.leading.trailing.equalToSuperview()
//            make.bottom.equalTo(toolBar.snp.top)
        }
    }

 

3. URL ์ƒ์„ฑ ํ›„ load

private func setWebView() {
//        self.view = webView // view ์ž์ฒด๋ฅผ webView๋กœ ๋ฎ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
        let url = URL(string: "<https://nosy-repair-8a6.notion.site/Web-views-b0673c13e9564ecfbe880481ab74454b>")
        let request = URLRequest(url: url!)
        webView.load(request)
    }

 


์š”๊ธฐ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ„๋‹ค๋ฅธ ์ปจํŠธ๋กค์ด ์—†๋Š” webView๋ฅผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ด์ „ ๋ทฐ์—์„œ present๋กœ ๋„์šด ๋ทฐ์— Web view๋ฅผ ์˜ฌ๋ ค์คฌ์Šต๋‹ˆ๋‹ค.)

WKWebView ๋””ํดํŠธ

2๏ธโƒฃ tool bar๋ฅผ ํ†ตํ•ด ์ปจํŠธ๋กค ์ถ”๊ฐ€ํ•˜๊ธฐ

HIG์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์•ž๋’ค๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์„ ํฌํ•จํ•œ tool bar๋ฅผ ์ƒ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

private let toolBar = UIToolbar()

...

private func setToolBar() {
        self.toolBar.backgroundColor = .white
        
        let backButtonItem = UIBarButtonItem(title: "๋’ค๋กœ ๊ฐ€๊ธฐ", style: .plain, target: self, action: #selector(backToView))
        let forwardButtonItem = UIBarButtonItem(title: "์•ž์œผ๋กœ ๊ฐ€๊ธฐ", style: .plain, target: self, action: #selector(forwardToView))
        let refreshButtonItem = UIBarButtonItem(title: "์ƒˆ๋กœ ๊ณ ์นจ", style: .plain, target: self, action: #selector(refreshView))
        
        let items = [backButtonItem, forwardButtonItem, refreshButtonItem]
        self.toolBar.setItems(items, animated: true)
    }
    
    private func setLayout() {
        self.view.addSubview(webView)
        self.view.addSubview(toolBar)
        
        toolBar.snp.makeConstraints { make in
            make.leading.trailing.equalToSuperview()
            make.bottom.equalTo(self.view.safeAreaLayoutGuide)
            make.height.equalTo(44)
        }
        
        webView.snp.makeConstraints { make in
            make.top.leading.trailing.equalToSuperview()
            make.bottom.equalTo(toolBar.snp.top)
        }
    }
    
    @objc
    private func backToView() {
        if webView.canGoBack {
            webView.goBack()
        } else {
            print("๋’ค๋กœ ๋ชป๊ฐ")
        }
    }
    
    @objc
    private func forwardToView() {
        if webView.canGoForward {
            webView.goForward()
        } else {
            print("์•ž์œผ๋กœ ๊ฐˆ๊ฒŒ ์—†์Œ")
        }
    }
    
    @objc
    private func refreshView() {
        webView.reload()
    }

๊ฒฐ๊ณผ

 

'UIUX' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[HIG] Modality ๐Ÿ˜ถโ€๐ŸŒซ๏ธ  (0) 2022.08.01
[HIG] Navigation Bar ๐Ÿงญ  (0) 2022.05.31
[HIG] Loading ๐Ÿ”„  (0) 2022.05.23
[HIG] Onboarding ๐Ÿ›ซ  (0) 2022.05.20
[HIG] ๐Ÿง Tab Bars  (0) 2022.04.29