반응형
웹뷰를 띄우기전 기본구성 - 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 등 ... 원하는곳이 파라미터를 넣어서 앱과 통신할수있다.
반응형
'IOS' 카테고리의 다른 글
(IOS)인앱 정기결제 적용하기(수정중) (1) | 2020.03.02 |
---|---|
(IOS)WKWebview 앱캐시 문제 (1) | 2020.02.26 |
(IOS)sms로 인증문자 받아서 keyboard위에 띄우기 (0) | 2020.01.30 |
(IOS) 토스트 만들기 - objective-c (0) | 2020.01.22 |
(IOS)스토리보드에서 VIEW 관리하기 (0) | 2020.01.21 |