본문 바로가기

IT/iOs

UIWebView WKWebView 비교 및 쿠키 저장 방법

 

UIWebView (deprecated)

쿠키 저장소 : HTTPCookieStorage

쿠키 저장 여부 : 휘발성 (앱이 메모리에서 해제되면 쿠키도 삭제됨)

웹과 상호작용 : 불편함 ( 웹에서 앱으로 메시지를 주고 싶을 때는 특정 url을 호출하는 방법으로 해야 함)

 

WKWebView

쿠키 저장소 : WKHTTPCookieStore

쿠키 저장 여부 : 비휘발성 (앱이 메모리에서 해제돼도 유지됨)

웹과 상호작용 :  WKUserContentController 를 사용하여 웹에서 앱으로 메시지 전달 가능 (Script message handler 기능)

 

 

 

 

 

<Script message handler 기능 사용법>

WKUserContentController에 핸들러 이름을 추가

userContentController.add(self, name: 핸들러 이름 )

 

WKScriptMessageHandler protocol 을 통해 콜백을 받음

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

 

message(WKScriptMessage) 를 통해 전달 값을 받음

message의 속성

name : 핸들러 이름

body : 여러 파라미터

 

WKUserContentController에 대한 더 자세한 설명 : 2019/11/25 - [iOs] - WKUserContentController 뽀개기

 

 

 

 

<여러 웹뷰에 쿠키 공유하는 법>

같은 WKProcessPool 객체를 사용하면 됨

 

 

 

<웹뷰에 스크립트 적용 방법>

1. WKUserContentController 사용

let cookieScript = WKUserScript.init(source: script source string, injectionTime: .atDocumentStart, forMainFrameOnly: false)

self.userContentController.addUserScript(cookieScript)

 

2. evaluateJavaScript 사용

wv.evaluateJavaScript(script source string, completionHandler: { result , error in })

 

 

 

 

<쿠키 세팅 방법>

1. WKUserContentController 사용하는 방법 (웹뷰에 스크립트 적용 방법 1번 항목 )

script source  : document.cookie = ‘쿠키 이름=쿠키 값;domain=도메인;path=경로;’;

 

2. WKWebsiteDataStore 을 이용하는 방법 ( ios11 이상 )

let cookie = HTTPCookie.init(properties: [

                        .domain : 도메인,

                        .path   : 경로,

                        .name   : 쿠키 이름,

                        .value  : 쿠키 값

                        ])

WKWebsiteDataStore.default().httpCookieStore.setCookie(cookie!, completionHandler: {})

 

 

 

<쿠키 가져오는 방법>

1.  evaluateJavaScript 사용 (웹뷰에 스크립트 적용 방법 2번 항목 )

script source  : document.cookie;

 

2. WKWebsiteDataStore 을 이용하는 방법 ( ios11 이상 )

let storage = WKWebsiteDataStore.default().httpCookieStore

storage.getAllCookies { cookies in }

 

 

 

 

<쿠키 삭제 방법>

1. WKUserContentController 사용하는 방법 (웹뷰에 스크립트 적용 방법 1번 항목 )

script source  :

- document.cookie = 'PHPSESSID=;’

- document.cookie = 'PHPSESSID=; path=/;domain=.test.com;expires=Thu, 01 Jan 1970 00:00:01 GMT;';

 

2. WKWebsiteDataStore 을 이용하는 방법 ( ios11 이상 )

let storage = WKWebsiteDataStore.default().httpCookieStore

storage.delete(cookie,completionHandler)

 

 

 

 

<웹뷰에서 사용하기 유용한 자바스크립트>

  • evaluateJavaScript 함수를 통해 아래 script를 사용하여 여러 이벤트 감지가 가능 

window.close = function(){ location.href = 'back://'; };

팝업 닫기 이벤트를 앱에 back://라는 url로 호출되게 하여 팝업 닫기 이벤트 감지 가능

window.open = function(url,d1,d2){location.href = 'popup://'+url;};

팝업 생성 이벤트를 앱에 popup://라는 url로 호출되게 하여 팝업 생성 이벤트 감지 가능

popup://뒤에 url을 붙게하여 호출하려던 url을 알 수 있으나 url이 없는 경우도 있으니 유의 필요

javascript: var allLinks = document.getElementsByTagName('a');

if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target');

if (target && (target == '_new' || target == '_blank')) {link.setAttribute('href','popup://'+link);}}};

target="_blank" , target="_new" 를 사용한 팝업 생성 이벤트를 앱에 popup://라는 url로 호출되게 하여 팝업 생성 이벤트 감지 가능

var s_ajaxListener = new Object();

s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;

s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;

s_ajaxListener.callback = function () {

    window.location='mpAjaxHandler://' + this.url;

};

 

XMLHttpRequest.prototype.open = function(a,b) {

  if (!a) var a='';

  if (!b) var b='';

  s_ajaxListener.tempOpen.apply(this, arguments);

  s_ajaxListener.method = a; 

  s_ajaxListener.url = b;

  if (a.toLowerCase() == 'get') {

    s_ajaxListener.data = b.split('?');

    s_ajaxListener.data = s_ajaxListener.data[1];

  }

}

 

XMLHttpRequest.prototype.send = function(a,b) {

  if (!a) var a='';

  if (!b) var b='';

  s_ajaxListener.tempSend.apply(this, arguments);

  if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;

  s_ajaxListener.callback();

}

ajax 이벤트 감지 가능

ajax 통신 발생 시 앱에 mpAjaxHandler://로 호출되게함

이 방법 외에 다른 방법도 있는 것으로 알지만 시도해보지 않았으므로 추후 보완하겠습니다.

 

 

 

 

 

protocol                                        name                                         description                                  sdk

   

Creates a new web view.

  • iOS 8.0+
  • macOS 10.10+
   

Displays a JavaScript alert panel.

  • iOS 8.0+
  • macOS 10.10+
   

Displays a JavaScript confirm panel.

  • iOS 8.0+
  • macOS 10.10+
   

Displays a JavaScript text input panel.

  • iOS 8.0+
  • macOS 10.10+
   

Notifies your app that the DOM window closed successfully.

  • iOS 9.0+
  • macOS 10.11+
   

Called when the user performs a pop action on the preview.

  • iOS 10.0+
WKNavigationDelegate  

Called when the web view begins to receive web content.

  • iOS 8.0+
  • macOS 10.10+
    Called when web content begins to load in a web view.
  • iOS 8.0+
  • macOS 10.10+
   

Called when a web view receives a server redirect.

  • iOS 8.0+
  • macOS 10.10+
   

Called when the web view needs to respond to an authentication challenge.

  • iOS 8.0+
  • macOS 10.10+
   

Called when an error occurs during navigation.

  • iOS 8.0+
  • macOS 10.10+
   

Called when an error occurs while the web view is loading content.

  • iOS 8.0+
  • macOS 10.10+
    Called when the navigation is complete.
  • iOS 8.0+
  • macOS 10.10+
   

Called when the web view’s web content process is terminated.

  • iOS 9.0+
  • macOS 10.11+
   

Decides whether to allow or cancel a navigation.

  • iOS 8.0+
  • macOS 10.10+
   

Decides whether to allow or cancel a navigation after its response is known.

  • iOS 8.0+
  • macOS 10.10+

     

 

 

 

 

WKWebView 쿠키

WKWebView 쿠키 저장방법

WKWebView 쿠키 동기화

WKWebView cookie 

WKWebView setCookie