1. 程式人生 > >JS和webView的交互

JS和webView的交互

receives alloc obj script esc 返回 led info mat

JSContext的交互方式最為簡單快捷:

1.申明一個JSContext對象

self.jsRunner = [[JSContext alloc] init];

2.在原生中定義申明一個JS函數方法(JS代碼函數中可以使用)

self.jsRunner[@"action1"] = ^(int value){

printf("啦啦啦\n");

};

self.jsRunner[@"action2"] = ^(JSValue *value){

NSLog(@"%@",value);

};

3.通過執行JS代碼的方式執行自己定義的函數(熱更新通過加載自定義好的JS函數專門來轉移實現原生消息發送相關函數,而後通過下載JS文件然後執行預定的代碼嘗試或達到替代原生代碼過程)

[self.jsRunner evaluateScript:@"action1(10);"];

[self.jsRunner evaluateScript:@"action2([1,2,3,\‘你好哦\‘]);function testAction(){return 99;};"];

JSValue *result = [self.jsRunner evaluateScript:@"testAction();"];

NSLog(@"返回的結果:%@",result);

在UIWebView中獲得JSContext,在代理OnFinshload函數中通過

self.jsRunner =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

獲得

在WKWebView中

You cannot obtain the context, because layout and javascript is handled on another process.

Instead, add scripts to your webview configuration, and set your view controller (or another object) as the script message handler.

- (void)setupWKWebView
{
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    
// 設置偏好設置 config.preferences = [[WKPreferences alloc] init]; // 默認為0 config.preferences.minimumFontSize = 10; // 默認認為YES config.preferences.javaScriptEnabled = YES; // 在iOS上默認為NO,表示不能自動通過窗口打開 config.preferences.javaScriptCanOpenWindowsAutomatically = NO; config.processPool = [[WKProcessPool alloc] init]; config.userContentController = [[WKUserContentController alloc] init]; //註意在這裏註入JS對象名稱 "JSObjec" [config.userContentController addScriptMessageHandler:self name:@"JSObjec"]; self.showWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config]; self.showWebView.navigationDelegate = self; [self.view addSubview:self.showWebView]; NSURL *path = [NSURL fileURLWithPath:網頁文件路徑]; [self.showWebView loadRequest:[NSURLRequest requestWithURL:path]]; } Now, send messages from JavaScript like so: //在JS函數代碼中調用 //這裏的內容差不多全部一樣 只是調用的方法有區別 一定要註意區分 //這個是用UIWebView時調用的方法 JSObjec.getCall(callInfo); //下面是用WKWebView調用的方法 window.webkit.messageHandlers.JSObjec.postMessage(callInfo); //當執行到上述語句是將回調下面這個函數 Your script message handler will receive a callback: - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { NSLog(@"%@", message.body); }



普通的實現方式:
通過WebView調用頁面中的JS函數,獲得返回值
通過代理鏈接截獲,執行原生代碼

JS和webView的交互