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. |
|
||
Displays a JavaScript alert panel. |
|
||
Displays a JavaScript confirm panel. |
|
||
Displays a JavaScript text input panel. |
|
||
Notifies your app that the DOM window closed successfully. |
|
||
Called when the user performs a pop action on the preview. |
|
||
WKNavigationDelegate |
Called when the web view begins to receive web content. |
|
|
Called when web content begins to load in a web view. |
|
||
Called when a web view receives a server redirect. |
|
||
Called when the web view needs to respond to an authentication challenge. |
|
||
Called when an error occurs during navigation. |
|
||
Called when an error occurs while the web view is loading content. |
|
||
Called when the navigation is complete. |
|
||
Called when the web view’s web content process is terminated. |
|
||
Decides whether to allow or cancel a navigation. |
|
||
Decides whether to allow or cancel a navigation after its response is known. |
|
WKWebView 쿠키
WKWebView 쿠키 저장방법
WKWebView 쿠키 동기화
WKWebView cookie
WKWebView setCookie
'IT > iOs' 카테고리의 다른 글
iOS13 Modal ViewController 변경사항 (0) | 2019.10.02 |
---|---|
iOS13(xcode11) NSData 변경사항 (0) | 2019.10.01 |
iOS 테스트 파일 실행 방법 (0) | 2019.08.21 |
iOS에서 사용자 설정 기업용 앱 설치하기 (0) | 2019.08.21 |
iOS에서 오류 보고서 보내는법 (0) | 2019.08.21 |