[iOS] WKWebView사용하기

2020. 1. 5. 17:55iOS

참조: [애플공식문서] (https://developer.apple.com/documentation/webkit/wkwebview)

 

먼저, 레퍼런스를 참고하여 사용해본 제 후기 겸 느낀 점을 기술하였기에, 사실과 다를 수 있습니다. 이점 피드백 주시면 수정하겠습니다.

WKWebView란?

인앱 브라우저같은 대화형 웹 컨텐트를 표시하는 객체입니다.

iOS8.0, OS X 10.10에 등장하였고, UIWebView, WebView는 사용하지 말라고 하네요.
확인해보니 방금 언급한 두가지 뷰는 'Deprecated', 편의를 위해 아래 부터는 WKWebView를 '웹뷰'로 칭하겠습니다.

웹뷰의 httpBody(Data)와 함께 구성된 'POST' 요청들을 만들 수 있습니다.
(개인적으로 의미가 확 와닿지는 않습니다. 일단 사용해보는거죠 뭐...)

먼저 WebKit를 import해줘야합니다. 생성자를 보니 frame, configuration이 필요하네요~

WKWebViewConfiguration클래스를 사용하여 얼마나 자주 웹페이지가 렌더링되는지, 미디어 재생처리 방법, 사용자가 선택 가능한 항목의 세분화 및 기타 옵션을 설정할 수 있는 '초기값'을 셋팅해줄 수 있습니다. 웹뷰(configuration)가 생성된 후, 변경하기 위해 해당 클래스를 사용하지 말라고합니다. 

 

웹뷰객체를 생성후, 로딩을 해야합니다. 로딩방법은 다음과 같은 두가지입니다.

loadHTMLString(_:baseURL:) 메소드를 사용하여 로컬에 있는 HTML파일을 로딩하거나, load(_:) 메소드를 사용하는 방법입니다.

 

저는 load(_:)를 사용하였으며 파라미터는 URLRequest입니다. 로딩할 웹페이지의 URL을 담아 두었지요. 

"애플 사이트는 열리는데.. 왜 다른건 안돼지 하시는 분" 계시다면, 네... 애플이 다른 일반적인 사이트는 허락을 안했나봐요 ㅎㅎ

방법이 없는건 아닙니다. info.plist에 NSAppTransportSecurity 키의 값에 Dictionary형식의NSAllowsArbitraryLoads키와 true값을 넣어주시면됩니다

 

stopLoading()메소드를 사용하여 로딩을 중지 할 수 도 있습니다.


웹페이지의 이력에따라 (canGoBack, canGoForward프로퍼티를 사용) 뒤로가기, 앞으로가기(goBack(), goForward()메소드를 사용)가 가능합니다.

웹페이지에 전화번호가 링크화되있고, 누르면 통화가 가능했던 걸 한번쯤은 경험 해보셨을 겁니다. 이 기능이 설정되있음이 default라네요. ㅎㅎ 역시 이 일을 시작하고 매번 느끼지만 그냥 되는건 없는거 같아요. 기능 비활성화는 phoneNumber라는 flag(WKDataDetectorTypes라는 구조체에 있어요)를 포함하지 않는 dataDetectorType이라는 프로퍼티로 설정하면 된답니다. 개인정보 보호를 위해 기능 비활성화를 할 것 같은데... 그냥 애초에 웹페이지에 번호가 없음 되는거 아닌가라는.....

setMagnification(_:centerdAt:)를 사용하여 처음 웹뷰에 표시되는 웹 컨텐트의 비율을 설정할 수 있으며, 그 후엔 사용자의 제스처로 변경이 가능합니다.

 

이쯤 되면, '보여지는건 된 것 같고... 뭔가 더 상호 작용할 만한 기능엔 뭐가 있을지, 어떻게 하면될까'라는 의문이 생길 수 있을 거에요

 

이럴때 저는 우선적으로 델리게이트를 떠올립니다. 역시나 WKNavigationDelegate, WKUIDelegate라는 프로토콜이 있네요^^

 

WKNavigationDelegate

 

WKNavigationDelegate 프로토콜의 메소드들은 네비게이션 요청을 '수락', '로딩' 및 '완료'하는 웹뷰의 프로세스 중에 트리거되는 사용자 지정 동작을 구현하는데 도움을 준답니다.

 

저는 기본적으로 페이지가 보여지기 전에 올바른 URL인지 먼저 확인을 해보고 싶어 webView(_:decidePolicyFor:decisionHandler) 메소드를 선택해서 사용해 보았습니다. 

탐색을 허용할지 말지를 결정이라고 소개 되어있네요.

 

페이지를 옮기려 누를때 마다 호출이되구요, 파라미터 첫번째 해당 웹뷰가 들어있고, 두번째 액션의요청에서 URL을 얻을수 있으며, 세번째 핸들러로 허락 또는 취소가 가능하네요^^

 

WKUIDelegate

 

WKUIDelegate.. 분명 프로토콜인데.. 왜 클래스라고 써있는지.. 모르겠네요 암튼 웹페이지를 대신하여 네이티브 유저의 인터페이스 요소를 표시하는 방법을 제공한답니다. 

 

웹서핑중 보았던 알림창 같은게 해당하겠군 생각했습니다. JavaScript 경고 창을 표시해준다라고 설명된 webView(_:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:) 

파라미터로 받는 message를 알람을 만들어 띄워주면 동일하겠네요. 그리고 JavaScript? Script? 저는 생소해요.. 찾다보니 아래 한가지 더 소개할 프로토콜이 있더군요

 

WKScriptMessageHandler

WKScriptMessageHandler 프로토콜에 부합하는 클래스는 웹 페이지에서 실행되는 JavaScript로부터 메세지를 수신하는 방법을 공합니다. 웹페이지를 볼수있음은 HTML파일을 다운을 받아서 화면에 표시되는 거고... HTML안에 JavaScript라는게 있다, JSCall 정도... 알게되었네요.

암튼 userContentControoler(_:didReceive:)메소드 하나가 있네요. 저는 message의 body에 담겨져있는 내용을 기준으로 switch문으로 분개하여 처리하게끔해서 좀더 웹과 제 앱간의 상호작용을 증진 시킨 것 같았어요

아참.. 찾다보니 이방법은 실행 중?에 사용하는거고, 처음 시작할때만 가능한 HTML을 통으로 심어서 하는 방법도 있다고합니다

 

읽어 주셔서 감사합니다, 도움이 되었다면 정말... 눈물이 한방울 나올 것 같네요..ㅋ

불러오는 중입니다...

 

'iOS' 카테고리의 다른 글

[iOS] App States  (0) 2020.02.04
[iOS] Core Location Framework  (0) 2020.02.02
[iOS] NCWidgetProviding Protocol  (0) 2020.01.16
[iOS] PushKit Framework  (0) 2020.01.11
[iOS] CallKit Framework이란  (0) 2020.01.08