iOS WKWebView与JS(HTML)的交互

在iOS的网页开发中,时常遇到一些需求,需要和JS(HTML)进行交互。
WKWebView与JS(HTML)的交互,其实就是互调:

  • iOS调用JS
  • JS调用IOS
    其实就是约定协议和传参的过程。

JS调用iOS

调用的方式有两种:
1- 协议拦截+WKNavigationDelegate的配合实现
2- WKScriptMessageHandler实现

1- 协议拦截

步骤

  • 约定协议 jsPassIOSProcol
  • WKNavigationDelegate 拦截协议
WKNavigationDelegate.png
2- WKScriptMessageHandler实现

步骤

  • 约定协议 jsPassIOSProcol
  • 添加消息监听 addScriptMessageHandler
  • h5发送协议消息,iOS使用 WKScriptMessageHandler 接收消息
  • 取消消息监听 removeScriptMessageHandlerForName
WKScriptMessageHandler.png
对比两种方式

h5代码采取的方式不同:

   //js调用iOS
   function loadUrl(url) {
     window.location.href = url
  }
   function jsPassIOS() { //约定好协议
     var url = "jsPassIOSProcol://" + "jsPassIOSAtion" + "?" + "=params"
     loadUrl(url)
   }
   //js调用iOS
  function loadUrl(url) {
   window.location.href = url
  }
  function jsPassIOSProcol(param1,param2) {
    var url = "jsPassIOSProcol://" + param1 + "?" + param2
    loadUrl(url)
  }
   function jsPassIOS() { //发送jsPassIOSProcol消息
    window.webkit.messageHandlers.jsPassIOSProcol.postMessage("jsPassIOSAtion", "=params");
   }

常用的提示交互

alert
  • js端调用alert函数的时候,会触发这个方法;
  • mesage: 拿到js端传递的数据;
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame
completionHandler:(void (^)(void))completionHandler {

}
confirm
  • js端调用confirm函数的时候,会触发这个方法;
  • mesage: 拿到js端传递的数据;
  • 确认/取消通过completionHandler回调给js端;
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {

}
prompt
  • js端调用prompt函数的时候,会触发这个方法;
  • prompt: 拿到js端传递的数据;
  • 在原生将文本内容,通过completionHandler回调给js端;
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt
    defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame
completionHandler:(void (^)(NSString * _Nullable result))completionHandler {

}
系统提示.png

iOS调用JS

调用JS.png

可以下载尝试一下:小Demo

webView的缩放

有两种方法:

  • 利用UIScrollViewDelegate方法
webView.scrollView.delegate = self
 func viewForZooming(in scrollView: UIScrollView) -> UIView? {
   return nil
 }

这种方法,有时候是不起作用的,而且在有输入弹框的h5,弹框不会随着键盘上下移动。

  • 往h5中,写入适配的js代码
 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
   //禁止缩放
   let javascript = "var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"
   webView.evaluateJavaScript(javascript, completionHandler: nil)
 }
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能。而说到 Nati...
    幽城88阅读 2,377评论 1赞 8
  • 在项目开发中,我们常常遇到这种情况,一个功能性界面需要分享到其他平台,或者是一个较复杂,原生框架不易实现,需要经常...
    zhangferry阅读 4,627评论 7赞 25
  • 卡车转眼间开始盘山绕行。刚拐了七八个弯,那个名叫良景瑜的“奶油小生”就忍不住干呕起来。 “坐到风口上...
    花星阅读 415评论 1赞 2
  • 想当年,金戈铁马,气吞万里如虎,是辛稼轩对建功立业时候的回忆;此诚只待成追忆,只是当时已惘然,是李义山对于...
    诗酒尚趁年华阅读 1,188评论 0赞 1
  • 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一...
    oowl阅读 865评论 0赞 2

友情链接更多精彩内容