일단, 나는 UIWebView 를 써보지 않았다. WKWebVIew만 써봤다. Android에 WebView랑 비슷한 듯.
하이브리드 앱에 홈페이지 로그인 할 때 자동 로그인 체크하고, 로그인을 하게 되면 앱이 종료되면 쿠키 삭제ㅋ 됨ㅋ 자동 로그인 안됌ㅋ 뭐지... 하고 이런저런 테스트를 해봤는데, WKWebView에는 php에 setcookie가 안 먹히드라. 결국 자동로그인 쿠키가 생성이 안됨ㅋ
안되면 되게 하라... 스크립트로 처리를 함.
AppDelegate에서
func applicationWillResignActive(_ application: UIApplication) { web.evaluateJavaScript("document.cookie", completionHandler: {(object, error) in if let string: String = object as? String { UserDefaults.standard.set(string, forKey: "cookie") } }) }
이렇게 앱이 foreground에서 벗어나게 되면 쿠키를 수시로 저장시키자. 아, 근데 php setcookie로 생성된 쿠키는 저기에서 확인이 안된다.ㅋ
일단 WKWebView에 WKUserContentController() 를 통해서 자바스크립트 인터페이스(안드로이드에서는 이렇게 부른다 swift에서는 콘텐츠컨트롤러라고하는건가...?)를 등록하고, 로그인 처리하는 페이지에서 스크립트로 실행 한 후에 UserDefault에다가 자동로그인 체크를 했다는 정보를 넘겨주어서 앱에서 자동으로 쿠키를 생성시켜서 처리를 했다.
let contentController = WKUserContentController(); let config = WKWebViewConfiguration(); contentController.add(self, name: "javascriptInterfaceName"); // name 에다가 원하는 자바스크립트인터페이스 이름을 입력하면 되시겠다. config.userContentController = contentController; let webview = WKWebView(frame: uiController.view.frame, configuration: configurate!)
그리고 웹페이지에서 어떻게 실행을 시키는 고하면
webkit.messageHandlers.javascriptInterfaceName.postMessage( { key1 : value1, key2 : value2, key3 : [ value3_1, value3_2 ] } );
위 소스를 실행시키면 된다.
위 소스를 실행시키게 되면,
@available(iOS 8.0, *) func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { // message.name 이녀석이 javascriptInterfaceName 이랑 매칭이 된다. 요녀석으로 용도별로 처리하면된다. // 보안 문제가 발생 할 경우가 있으니까 꼭 if message.name != "javascriptInterfaceName" {return} 이런 식으로 지정한 스크립트가 아니라면 막길 권한다. guard let mbody = message.body as? Dictionary<String,Any> else {return} // json 형식으로 파라미터 값을 넘겼으니까 Dictionary로 변환 가능하다. let value1 = mbody["key1"] as? Any let value2 = mbody["key2"] as? Any let value3 = mbody["key3"] as? Array<Any> // 마지막은 리스트형식이니까, }
WKWebView 내의 이런 소스에서 실행이 된다. 참고로 iOS8 부터 사용 가능하다.
이렇게 아무튼 저기서 자동로그인 체크를 했다는 것을 앱으로 전달해서 UserDefault에 다가 저장했다가 앱 실행시마다 자동로그인 쿠키값을 생성해주면 되겠다. 어떻게?? 아래처럼 참고하자.
아래 setCookie에 해당하는 메소드는 구글링을 통해서 찾았으나, 출처를 따로 안적어놨네..........죄송합니다..
webview.evaluateJavaScript("document.setCookie = function (name, value, expiredays) {var cookie = name + \"=\" + escape(value) + \"; path=/;\"; if (typeof expiredays != 'undefined') {var todayDate = new Date(); todayDate.setDate(todayDate.getDate() + expiredays); cookie += \"expires=\" +todayDate.toGMTString() + \";\"; } document.cookie = cookie;}",completionHandler: nil)
WKWebView에다가 저렇게 하고
webview.evaluateJavaScript("document.setCookie('\(key)','\(value)', '\(expiredays)')", completionHandler: { (o,e) in web.reload() })
이렇게 key(쿠키 명), value(쿠키 값), expiredays(저장 기간) 값을 넣어서 쿠키를 생성시키고, 페이지 새로고침을 해줘야 제대로 인식을 한다.
마지막으로 저기 document에 체이닝 되어진 setCookie 메소드를 제거해주자.
webview.evaluateJavaScript("delete document.setCookie", completionHandler: nil)
이렇게 하면 깔끔하게 처리가 된다.
'모바일 개발 > iOS-Swift' 카테고리의 다른 글
초기화에 대해서.. (0) | 2017.10.25 |
---|