반응형

웹뷰를 띄우기전 기본구성 - 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 등 ... 원하는곳이 파라미터를 넣어서 앱과 통신할수있다.

반응형

+ Recent posts