IOS
(IOS)wkwebview 적용해보기
highjune
2020. 1. 31. 15:11
반응형
웹뷰를 띄우기전 기본구성 - objectivC
//make configuration, share session pool
-(WKWebViewConfiguration*)createWebviewConfiguration:(UIViewController*)vc shareData:(CustomShare*)shareData{
//webview function setting
WKPreferences *pref = [[WKPreferences alloc] init];
pref.javaScriptEnabled = true;
pref.javaScriptCanOpenWindowsAutomatically = true;
// web에서 호출할 펑션이름 webkit.messageHandlers.AppFunction.postMessage("원하는 데이터")
WKUserContentController *contentController = [[WKUserContentController alloc] init];
[contentController addScriptMessageHandler:vc name:@"AppFunction"];
//html이 완전히 로드됬을때 스크립트 주입하도록 WKUserScriptInjectionTimeAtDocumentEnd
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:@"" injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:true];
[contentController addUserScript:userScript];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = contentController;
config.preferences = pref;
config.processPool = [shareData sharedWebViewPool];//세션풀을 공유하기위한 부분
return config;
}
세션풀 공유를위해 CustomShare
- (WKProcessPool *)sharedWebViewPool {
static WKProcessPool *pool;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!pool) {
pool = [[WKProcessPool alloc] init];
}
});
return pool;
}
웹뷰를 띄우기전 기본구성 - swift
import UIKit
import WebKit
class CMWkWebview: NSObject {
public static var HandlerName = "AppFunction"
//not use session pool
public static func createWebviewConfiguration(handler:WKScriptMessageHandler) -> WKWebViewConfiguration{
let pref = WKPreferences()
pref.javaScriptEnabled = true
pref.javaScriptCanOpenWindowsAutomatically = true;
let script = WKUserScript(source: "", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let contentCon = WKUserContentController()
contentCon.addUserScript(script)
contentCon.add(handler, name: HandlerName)
let config = WKWebViewConfiguration()
config.userContentController = contentCon
config.preferences = pref
return config
}
//use session pool
public static func createWebviewConfiguration(handler:WKScriptMessageHandler, processPool:WKProcessPool) -> WKWebViewConfiguration{
let pref = WKPreferences()
pref.javaScriptEnabled = true
pref.javaScriptCanOpenWindowsAutomatically = true;
let script = WKUserScript(source: "", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let contentCon = WKUserContentController()
contentCon.addUserScript(script)
contentCon.add(handler, name: HandlerName)
let config = WKWebViewConfiguration()
config.userContentController = contentCon
config.preferences = pref
config.processPool = processPool
return config
}
}
wkprocesspool을 사용함으로써 새로 웹뷰를 생성해도 processpool만 메모리에 보존된다면 session을 유지한상태로 웹뷰를 구성할수있다.
사용 - objectivC
@interface HomeViewController : BaseViewController<WKScriptMessageHandler>
@end
- WKScriptMessageHandler 프로토콜을 가저와서
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSString *msg = message.body;
if ( [[message name] isEqualToString:@"AppFunction"] ){
//custom function
}
}
-이곳에 커스텀 펑션을 구현하면된다.
사용 - swift
override func viewDidLoad() {
super.viewDidLoad()
let configuration = CMWkWebview.createWebviewConfiguration(handler: self)
let webview = WKWebView(frame: UIScreen.main.bounds, configuration: configuration)
self.view.addSubview(webview)
}
extension YourController :WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == CMWkWebview.HandlerName {
print("web data : \(message.body)")
}
}
}
web에서 작동
webkit.messageHandlers.AppFunction.postMessage("원하는 데이터")
- 웹쪽에선 버튼이나 onLoad function 등 ... 원하는곳이 파라미터를 넣어서 앱과 통신할수있다.
반응형