# WKWebView

> 원문 출처\
> <https://developer.apple.com/documentation/webkit/wkwebview>

## Summary

> **SDKs**
>
> * iOS 8.0+
> * macOS 10.10+
>
> **Framework**
>
> * WebKit

## Declaration

{% tabs %}
{% tab title="Swift" %}
{% code title="iOS, Mac Catalyst" %}

```swift
class WKWebView : UIView
```

{% endcode %}

{% code title="macOS" %}

```swift
class WKWebView : NSView
```

{% endcode %}
{% endtab %}

{% tab title="Objective-C" %}
{% code title="iOS" %}

```objectivec
@interface WKWebView : UIView
```

{% endcode %}

{% code title="macOS" %}

```objectivec
@interface WKWebView : NSView
```

{% endcode %}
{% endtab %}
{% endtabs %}

## 개요 <a href="#overview" id="overview"></a>

{% hint style="info" %}
Important

iOS 8.0과 OS X 10.10부터는 웹 컨텐츠를 앱에 추가할 때 WKWebView를 사용해야 합니다. UIWebView나 WebView를 사용하지 마세요.
{% endhint %}

WKWebView 클래스를 사용하면 웹 컨텐츠를 앱에 내장시킬 수 있습니다. WKWebView 클래스를 사용하기 위해서는 WKWebView 객체를 생성하고 뷰로써 설정한 다음 웹 컨텐츠를 불러오기 위해서 요청을 보내야 합니다.

{% hint style="warning" %}
Note

WKWebView 안에서 [httpBody](https://melod-it.gitbook.io/sagwa/etc/not-found) 컨텐츠로 POST 요청을 할 수 있습니다.
{% endhint %}

[init(frame:configuration:)](https://melod-it.gitbook.io/sagwa/etc/not-found) 메서드로 새 WKWebView 객체를 생성한 후에는 웹 컨텐츠를 로딩해야 합니다. [loadHTMLString(\_:baseURL:)](https://melod-it.gitbook.io/sagwa/etc/not-found) 메서드는 로컬 HTML파일을, [load(\_:)](https://melod-it.gitbook.io/sagwa/etc/not-found) 메서드로는 웹 컨텐츠의 로드를 시작할 수 있습니다. [stopLoading()](https://melod-it.gitbook.io/sagwa/etc/not-found) 메서드는 로딩을 멈추게 할 수 있으며 [isLoading](https://melod-it.gitbook.io/sagwa/etc/not-found) 프로퍼티는 웹 뷰가 로딩중인지를 알 수 있습니다. [WKUIDelegate](https://melod-it.gitbook.io/sagwa/etc/not-found) 프로토콜을 준수하는 객체를 delegate 프로퍼티로 지정하여 웹 컨텐츠의 로딩을 추적할 수 있습니다. Listing 1에서 WKWebView를 프로그래밍적으로 생성하는 예시를 확인하세요.

{% code title="Listing 1. 프로그래밍적으로 WKWebView 생성" %}

```swift
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }}
```

{% endcode %}

사용자가 웹페이지 기록의 앞이나 뒤로 이동할 수 있게 하려면 [goBack()](https://melod-it.gitbook.io/sagwa/etc/not-found)과 [goForward()](https://melod-it.gitbook.io/sagwa/etc/not-found) 메서드를 버튼의 액션으로 지정하세요. [canGoBack](https://melod-it.gitbook.io/sagwa/etc/not-found)과 [canGoForward](https://melod-it.gitbook.io/sagwa/etc/not-found) 프로퍼티는 사용자가 해당 방향으로 이동하지 못하게 할 수 있습니다.

기본적으로 웹 뷰는 웹 컨텐츠 상의 전화번호를 전화 링크로 자동변환합니다. 전화 링크를 터치하면 전화 앱이 실행되고 전화번호가 입력됩니다. 이 기본동작을 끄려면 [WKDataDetectorTypePhoneNumber](https://melod-it.gitbook.io/sagwa/etc/not-found) 플래그가 없는 [WKDataDetectorTypes](https://melod-it.gitbook.io/sagwa/etc/not-found) 비트필드를 사용해서 [dataDetectorTypes](https://melod-it.gitbook.io/sagwa/etc/not-found) 프로퍼티를 설정하세요.

[setMagnification(\_:centeredAt:)](https://melod-it.gitbook.io/sagwa/etc/not-found)을 사용해서 웹 뷰가 처음 웹 컨텐츠를 표시할 때 표시 스케일을 설정할 수 있습니다. 따라서 사용자는 제스처를 통해 스케일을 조절할 수 있습니다.

## 주제 <a href="#topics" id="topics"></a>

### &#x20;Determining Whether WebKit can Load Content

* *class* *func* handlesURLScheme(String) -> Bool\
  리소스를 로딩하는 특정 URL 스키마에 대한 WebKit의 네이티브 지원 여부를 반환합니다.

### 웹 뷰 초기화 <a href="#initializing-a-web-view" id="initializing-a-web-view"></a>

* *var* configuration: WKWebViewConfiguration

  웹 뷰를 초기화하기 위한 설정의 복사본
* init(frame: CGRect, configuration: WKWebViewConfiguration)\
  지정된 프레임과 설정으로 초기화된 웹 뷰를 반환합니다.
* init?(coder: NSCoder)

### 뷰 정보 검사 <a href="#inspecting-the-view-information" id="inspecting-the-view-information"></a>

* *var* scrollView: UIScrollView\
  웹 뷰에 연결된 스크롤 뷰
* *var* title: String?\
  페이지 제목
* *var* url: URL?

  활성 URL
* *var* customUserAgent: String?

  커스텀 User agent 문자열
* *var* serverTrust: SecTrust?\
  현재 커밋된 탐색에 대한 SecTrustRef 객체
* ~~*var* certificateChain: \[Any]~~ `Deprecated`

  An array of objects forming the certificate chain for the currently committed navigation.

### Delegate 설정 <a href="#setting-delegates" id="setting-delegates"></a>

* *var* navigationDelegate: WKNavigationDelegate?

  웹 뷰의 네비게이션 delegate
* *var* uiDelegate: WKUIDelegate?\
  웹 뷰의 유저 인터페이스 delegate

### 컨텐츠 로딩 <a href="#loading-content" id="loading-content"></a>

* *var* estimatedProgress: Double

  현재 네비게이션의 로드량을 추정합니다.
* *var* hasOnlySecureContent: Bool\
  페이지의 모든 리소스가 안전하게 암호화된 연결을 통해서 로드된 것인지를 나타냅니다.
* *func* loadHTMLString(String, baseURL: URL?) -> WKNavigation?\
  웹페이지 내용과 base URL을 설정합니다.
* *var* isLoading: Bool\
  뷰가 현재 컨텐츠를 로딩 중인지를 나타냅니다.
* *func* reload() -> WKNavigation?\
  현재 페이지를 새로고침합니다.
* *func* reload(Any?)\
  현재 페이지를 새로고침합니다.
* *func* reloadFromOrigin() -> WKNavigation?\
  (가능하다면) 캐시 유효성 검사 조건을 사용하여 종단간 재검증을 수행하고 현재 페이지를 새로 고침합니다.
* *func* reloadFromOrigin(Any?)

  (가능하다면) 캐시 유효성 검사 조건을 사용하여 종단간 재검증을 수행하고 현재 페이지를 새로 고침합니다.
* *func* stopLoading()

  현재 페이지의 모든 리소스 로딩을 중단합니다.
* *func* stopLoading(Any?)\
  현재 페이지의 모든 리소스 로딩을 중단합니다.
* *func* load(Data, mimeType: String, characterEncodingName: String, baseURL: URL) -> WKNavigation?\
  웹페이지 컨텐츠와 base URL을 설정합니다.
* *func* loadFileURL(URL, allowingReadAccessTo: URL) -> WKNavigation?\
  파일 시스템 상의 요청된 파일 URL로 이동합니다.

### 컨텐츠 스케일링 <a href="#scaling-content" id="scaling-content"></a>

* *var* allowsMagnification: Bool

  확대 제스처를 통한 웹 뷰 확대 여부를 나타냅니다.
* *var* magnification: CGFloat

  The factor by which the page content is currently scaled.
* *func* setMagnification(CGFloat, centeredAt: CGPoint)

  지정된 값에 따라서 페이지 컨텐츠를 확대하고 중심점을 맞춥니다.

### Navigating

* *var* allowsBackForwardNavigationGestures: Bool

  수평 스와이프를 통한 전후 페이지 이동가능 여부를 나타냅니다.
* *var* backForwardList: WKBackForwardList\
  웹 뷰의 전후 리스트
* *var* canGoBack: Bool\
  back-forward 리스트 상에 이전 항목이 존재하는 경우 해당 항목으로 이동이 가능한지에 대한 여부를 나타냅니다.
* *var* canGoForward: Bool\
  back-forward 리스트 상에 다음 항목이 존재하는 경우 해당 항목으로 이동이 가능한지에 대한 여부를 나타냅니다.
* *var* allowsLinkPreview: Bool\
  링크를 눌렀을때 미리보기의 표시 여부를 나타냅니다.
* *func* goBack() -> WKNavigation?\
  back-forward 리스트상의 이전 항목으로 이동합니다.
* *func* goBack(Any?)\
  back-forward 리스트상의 이전 항목으로 이동합니다.
* *func* goForward() -> WKNavigation?\
  back-forward 리스트상의 다음 항목으로 이동합니다.
* *func* goForward(Any?)\
  back-forward 리스트상의 다음 항목으로 이동합니다.
* *func* go(to: WKBackForwardListItem) -> WKNavigation?\
  back-forward 리스트 상의 항목으로 이동하고 현재 항목으로 설정합니다.
* *func* load(URLRequest) -> WKNavigation?\
  요청 URL로 이동합니다.

### 자바스크립트 실행 <a href="#executing-javascript" id="executing-javascript"></a>

* *func* evaluateJavaScript(String, completionHandler: ((Any?, Error?) -> Void)?)\
  자바스크립트 문자열을 평가합니다.

### 스크린샷 캡처 <a href="#taking-snapshots" id="taking-snapshots"></a>

* *func* takeSnapshot(with: WKSnapshotConfiguration?, completionHandler: (UIImage?, Error?) -> Void)\
  뷰에서 보여지고 있는 뷰포트의 스크린샷을 찍습니다.

## 관련 문서 <a href="#relationships" id="relationships"></a>

### 상속 <a href="#inherits-from" id="inherits-from"></a>

* NSView
* UIView

### 준수하는 프로토콜 <a href="#conforms-to" id="conforms-to"></a>

* CVarArg
* Equatable Hashable
* NSStandardKeyBindingResponding
* NSTouchBarProvider
* NSUserActivityRestoring
* NSUserInterfaceValidations
* UIAccessibilityIdentification
* UILargeContentViewerItem
* UIPasteConfigurationSupporting
* UIUserActivityRestoring

## 같이 보기 <a href="#see-also" id="see-also"></a>

### 초기화 <a href="#initialization" id="initialization"></a>

* *protocol* WKNavigationDelegate\
  WKNavigationDelegate 프로토콜 메서드는 웹 뷰 네비게이션 요청의 수락, 로딩, 완료 중에 트리거되는 커스텀 동작의 구현을 돕습니다.&#x20;
* *class* WKProcessPool\
  WKProcessPool 객체는 웹 컨텐츠 프로세스 풀을 나타냅니다.
* *class* WKWindowFeatures\
  WKWindowFeatures 객체는 새 웹 뷰를 요청할때 포함된 창에 대한 옵셔널 속성을 지정합니다.
* *class* WKWebViewConfiguration\
  웹 뷰를 초기화하는데 사용되는 프로퍼티 콜렉션
* *class* WKPreferences\
  WKPreferences 객체는 웹 뷰에 대한 기본 설정을 캡슐화합니다.
* *class* WKWebpagePreferences `Beta`
* *protocol* WKUIDelegate\
  WKUIDelegate 클래스는 웹 페이지를 대신하여 네이티브 유저 인터페이스 요소를 표시하는 메서드를 제공합니다.
* 웹 뷰를 사용하여 데스크탑이나 모바일 웹 컨텐츠 보기\
  웹 사이트의 데스크톱 또는 모바일 버전을 볼 수있는 간단한 iPad 웹 브라우저를 구현하세요.
