通过执行函数evaluateJavaScript:completionHandler:,我们可以传递app端中的数据给webview,并触发html脚本函数的调用,从而响应app的行为。...2、webview如何调用app端的函数呢? 在html的脚本中添加iframe对象,通过设置iframe的src属性,可成功触发WKWebview中的代理方法调用。..., 我们可以在代理方法中拦截请求,首先iframe的src的值也就是我们自定义的scheme,通过对该scheme的判断来得知我们想干什么,从而去调用app中对应的函数。...除了可以在自定义scheme中传递我们需要的参数外,我们可以在html中的脚本中把数据储存好,通过evaluateJavaScript:completionHandler:来调用脚本函数来返回需要的参数...具体如何通过WKWebview传递过来的数据来判断该执行哪个函数,有一种实现方式: 用一个字典来储存对应函数地址,这样我们可以通过传递过来的key来获得对应的函数。
除了代理方法和WKWebView的使用不太一样,关于WKWebView更详尽的讲解和用法,还是自行搜索学习,本文重点还是讲解如何实现JS 与OC 互相调用。...2.拦截URL 使用WKNavigationDelegate中的代理方法,拦截自定义的URL来实现JS调用OC方法。...关于如何区分执行不同的OC 方法,也与UIWebView的处理方式一样,通过URL 的host 来区分执行不同的方法: #pragma mark - private method - (void)handleCustomAction...这时候就是OC 调用JS 方法的场景。 WKWebView 提供了一个新的方法evaluateJavaScript:completionHandler:,实现OC 调用JS 等场景。...,至于在哪里调用,倒是无所谓,我们也可以写在方法实现的第一行,或者最后一行。
对 alert、confirm、prompt 等方法做了拦截,如果通过此方式进行 Native 与 JS 交互,需要实现 WKWebView 的三个 WKUIDelegate 代理方法。...注入 API 基于 Webview 提供的能力,我们可以向 Window 上注入对象或方法。JS 通过这个对象或方法进行调用时,执行对应的逻辑操作,可以直接调用 Native 的方法。...在 4.4 以前,通过 loadUrl 方法,执行一段 JS 代码来实现。在 4.4 以后,可以使用 evaluateJavascript 方法实现。...evaluateJavascript 方法效率高获取返回值方便,调用时候不刷新WebView,但是只支持 Android 4.4+。...:@"ZcyJsBridge(ev, data)"] JSBridge 的使用 如何引用 由 H5 引用 在我司移动端初期版本时采用的是该方式,采用本地引入 npm 包的方式进行调用。
方法报错 2、WKNavigationDelegate: 这个代理在加载的各个过程中都有回调,可以根据项目需求,做响应的处理: 前面三个 `func webView(_ webView: WKWebView..., decidePolicyFor ...` 的方法是一样的,只是带的参数不一样,如果实现了,就必须调用`decisionHandler`进行响应的处理,否则报错。...其实上面的代理实现的已经差不多了,下面补充并说明一下: 1、evaluateJavaScript的使用 1)、首先我们在`WKNavigationDelegate`的`didFinish`方法回调后,...{ print("加载完成: didFinish") // 调用js方法(把标题h1设置成红色) webView.evaluateJavaScript("changeHead()...2)、这里在app的原生页面写了两个button调用JS的方法/获取信息 func setupButtons() { let baseHeight = (navigationController?.
在开发iOS版的直播卖货系统源码过程中,如何在html上展示商品详情,下面小编将从WKWebView入手,来介绍下实现过程。...1、创建WKWebview - (WKWebView *)webView{ if (!...加载完成的代理方法中更改webView的frame - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified..., _goodListView.bottom, _window_width, [result doubleValue]);//将WKWebView的高度设置为内容高度 //更改背景scrollview的滑动范围...的代理方法中拦截图片添加的点击方法,可使用HZPhotoBrowser来展示图片 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction
代理方法 添加引用 import WebKit 代理 WKNavigationDelegate 页面加载状态的回调 代理方法 func webView(_ webView: WKWebView, didStartProvisionalNavigation..., withError error: Error) { } 代理 WKUIDelegate 处理JS弹窗的回调 代理方法 //消息弹窗 func webView(_ webView: WKWebView...-> Void) { completionHandler("哈哈"); } 交互 Swift调用JS方法 self.webview.evaluateJavaScript("loadData('123'...{ self.setNavi() //这一行是为了 页面加载完成后 调用js方法 加载数据 self.webview.evaluateJavaScript("loadData('...123')") { (response, error) in } } 替换页面中的引用的JS/CSS为本地文件 暂时没有什么好的解决方法 没有像android可以拦截替换的方法
{ //页面加载完成时 webView.evaluateJavaScript( "document.documentElement.style.webkitUserSelect='none...alert函数时,会触发此代理方法。...// JS端调用alert时所传的数据可以通过message拿到 // 在原生得到结果后,需要回调JS,是通过completionHandler回调 self.showNoticeText(message...confirm函数时,会触发此方法 // 通过message可以拿到JS端所传的数据 // 在iOS端显示原生alert得到YES/NO后 // 通过completionHandler回调给...-> Void) { // JS端调用prompt函数时,会触发此方法 // 要求输入一段文本 // 在原生输入得到文本内容后,通过completionHandler回调给JS let
随着摒弃了对iOS老系统的支持,项目也开始逐步开始转向WKWebView,本想着新系统应该能填一些WKWebView的坑,结果发现还是还是坑不断,这次在iOS12又遇到一个神坑。...为了验证下,我在WKWebView的delegate方法webView: didFinishNavigation:里打印customUserAgent和通过js方法获取的userAgent,结果发现两者真的是不一样的...iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)) 所以,这种设置userAgent的方法在...iOS 12是不生效的,猜测原因应该是一旦实例化一个WKWebView并且调用了evaluateJavaScript: 更新其userAgent不生效。...但是一旦我们刷新下当前web页面,即调用webview的reload方法,这个customUserAgent就生效了。所以这应该是苹果iOS12系统的一个bug。
至于你想到的如何加载网页,其实很简单,一个load而已。 self.wkWebView?....{ print("JSON Serialization Error") } } 那么JavaScript该如何调用发消息过来呢?...,arguments); } Native向JavaScript发送消息就更不用说了,直接调用“evaluateJavaScript”方法注入就好,唯一的优势是在于,发送的消息可以先转成JSON,然后字符串化当参数传入到一个函数里...在此之前,我们应该先监控好一个应用打开的完整状态,你需要实现WKNavigationDelegate协议,如下几个方法: func webView(_ webView: WKWebView, didStartProvisionalNavigation...{ // 页面开始加载时调用 } func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)
JS调用iOS方法url拦截弹窗拦截(alert、confirm、prompt)JavaScriptCore(只适用于UIWebView)WKScriptMessageHandler(只适用于WKWebView...,iOS8+)Bridge第三方框架(适用于UIWebView和WKWebView)1. url拦截url拦截是在H5请求一个地址后,客户端拦截住这个地址,对地址进行解析处理H5中调用iOS方法代码:方法中处理以WKWebView的alert为例:- (void)webView:(WKWebView *)webView...JSBridgeJS桥接第三方框架(1)第三方框架DSBridge(2)第三方框架WebViewJavascriptiOS调用JS方法1. UIWebView2. WKWebView1. ...");图片Android调用JS1. loadUrl()2. evaluateJavascript() (Android4.4之后)1. loadUrl// 调用H5中的loginResult函数webView.loadUrl
上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascriptBridge...下面开始介绍WKWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用。...第四步,在HTML添加关键的js HMTL 里在调用Native 功能之前,要先添加一个js 方法,然后主动调用一次该方法。...执行wvjbscheme://__BRIDGE_LOADED__,然后在WKWebView 的navigationDelegate方法中拦截该URL ,然后往HMTL中注入js。...执行js 的API 与 UIWebView 有些不同,WKWebView 用的是{-evaluateJavaScript: completionHandler:},这个API 不会立刻返回执行结果,js
,需要打开新页面时,将先调用这个方法。...='none';" completionHandler:nil]; 值得注意的是,这里其实是通过调用webView直接使用JS代码实现的操作,如果有需要还可以实现别的功能,而且这个方法最后有一个执行完毕之后的...重点:JS交互 ---- WKWebView的交互方法和之前的UIWebView其实本质上没有什么太大的差别,都是通过发送方法名找到对应的方法执行对应的操作。...self.webView.configuration.userContentController.userScripts.count>0) { //移除所有的监听 [self removeAllScriptMsgHandle]; } //对JS调用的方法进行监听...//用来接收js调用本地方法的拦截器 -(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage
results = [self.webView stringByEvaluatingJavaScriptFromString:"foo()"]; WKWebView WKWebView 可以使用 evaluateJavaScript...那么这几个 API 又是如何实现的呢?这里 Android 和 iOS 封装不一致,应当分开来说。...,它是提供 JS 调用 Native 功能的方法。...前面说过,客户端想调用 JS 方法,只能调用挂载到 window 对象上面的。 因此,这里使用了一种很巧妙的方法,实际上 callback 函数依然是 JS 执行的。...iOS 和 Android 中最显著的差异就在于这个 window.bridge.send 方法的实现,Android 里面是直接调用 Native 的方法,iOS 中是通过 URL Scheme 的形式调用
框架中的负责网页的渲染与展示的类,相比UIWebView速度更快,占用内存更少,支持更多的HTML特性 I JS调用iOS 使用例子:点击页面图片,调用iOS方法进行图片放大显示 1.1 JS代码: window.webkit.messageHandlers.openImage.postMessage...的-evaluateJavaScript:completionHandler:方法来实现 WKWebView的-evaluateJavaScript:completionHandler:方法可以执行JS...但只有在整个webView加载完成之后调用此方法才会有响应 2.1 执行JS iOS使用WKWebView的-evaluateJavaScript:completionHandler:方法执行拼接好的JS...WKWebView在每次加载请求完成后会调用此方法 (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation...WKNavigationDelegate 代理方法的调用流程 UIProcess、WebContent、NetworkProcess 三大进程间的通信关系 NetworkProcess进程: 主要负责网络请求加载
} // 调用Swift方法 function responseSwift() { // 这里的...{ // sayHello()是JS的方法 webView.evaluateJavaScript("sayHello('WebView你好!')")...{ (result, err) in print(result, err) } } WKScriptMessageHandler:JS 调用 Swift 时需要用到协议中的一个方法来...{ // 调用JS方法 webView.evaluateJavaScript("sayHello('WebView你好!')")...// Swift方法,可以在JS中调用 func userContentController(_ userContentController: WKUserContentController,
WKWebView 适用于iOS8之后的系统 引用 #import 1.OC调用JS NSString *jsmethod = [NSString stringWithFormat...:@"mymethd(\"%@\")",data]; //data(NSDate)为要传给js的数据 [self.wkWebView evaluateJavaScript:jsmethod...completionHandler:^(id _Nullable result, NSError * _Nullable error) { // result js返回值 }]; 2.JS调用...OC (1)遵循代理 @interface SharecgiteViewController () (2)添加方法监听...window.webkit.messageHandlers.share.postMessage(message); (5)释放js交互,在页面推出的时候,调用 WKUserContentController
WebViewJavaScriptBridge 使用一个不可见的 iFrame 来触发消息传递, 应该是为了兼容 UIWebView 和 WKWebView。...kQueueHasMessage "wvjb_queue_message" 这个是消息发送的 url,收到这个消息后,调用 WKFlushMessageQueue 方法,开始走 JS调用原生流程....JS 调用原生(以 WKWebView 为例) callHandler => _doSend 设置 iFrame 的 src 属性 WKWebView 代理方法- (void)webView:(WKWebView...如果是回调消息,直接通过 responseId 拿到回调的 block,拿到消息里面的 data,执行 block. 如果是 js 调用原生的消息。...removeObjectForKey:responseId]; } else { /* 没有 responseId ,说明是 js 调用原生的方法
内部的处理类 这就造成了对原始的调用方法有一定的影响 WKWebView iOS 8 之后,无疑没有理由不使用 WKWebView 在 JS 端只需要 window.webkit.messageHandler...在 APP 端只需要 evaluateJavaScript 既可以调用 JS 方法 通过上面三种方法便可以实现大多数的 JS 原生交互 WKUserScript 通过configuration.userContentController.addUserScript...github.com/TieShanWang/WKJSHandler 上面找到 当然也可以直接使用 cocoapod 使用 pod 'WKJSHandler' 安装 当然现在实现了 JS 和 Native 之间的直接方法的调用...只能够调用APP的一个方法,并且传参,没有办法直接回调 JS。...同样在我们调用 JS 方法后也希望 JS 在处理完毕之后会给我们一个回调 我们的需求是 “回调“ 在下一章 将会解决一下回调的问题 MessageHandler 高级用法二:原生调用JS 实现回调
领取专属 10元无门槛券
手把手带您无忧上云