欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift - WKWebView、UIWebView与js交互 简单使用

程序员文章站 2024-02-05 20:52:52
...

之前开发过移动端与js交互,近期又遇到了同样的需求,所以干脆记录一下自己项目中用的知识点

Swift - WKWebView、UIWebView与js交互 简单使用

前言


在日常开发中,webview的使用是很常见的。UIwebview和WKWebView我在项目都有用到,不过苹果现在主推的是WKWebView。因人而异,自己喜欢用哪个就用哪个。本文是记录一下我在项目中用webview做的一些操作。(本文为原创,转发请标明出处)


应用场景


webview和前端页面交互,就是移动端调用h5的方法,同时h5也可以调用移动端的方法。
我们前端有个需求,就是在我们移动端加载h5的时候,需要给网页传一个值,所以h5定义了一个方法,叫getuuid
这个方法名是我与前端工程师约定好的
Swift - WKWebView、UIWebView与js交互 简单使用

webview给h5传值


1、UIWebView

func webViewDidFinishLoad(_ webView: UIWebView) {
        let User_UIID: String = KeychainTool.shared.getUUID() ?? ""
        let userName: String = UserModel.shared.username ?? ""
        self.webView.stringByEvaluatingJavaScript(from: "getuuid('\(User_UIID)','\(userName)')")
}

2、WKWebView

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
     let User_UIID: String = KeychainTool.shared.getUUID() ?? ""
     let userName: String = UserModel.shared.username ?? ""
     self.webView.evaluateJavaScript("getuuid('\(User_UIID)','\(userName)')") { (dic, error) in
          print("\(dic)--\(error?.localizedDescription)---\(userName)--\(User_UIID)")
          if error == nil {
             传值成功
          }
    }
}

给h5传值就是这么简单粗暴

h5给webview传值


h5给webview传值的,WKWebView和UIWebView稍微有点不同

1、WKWebView

h5给webview传值,一样需要前端和移动端约定好一个方法名。
前端的代码,regcallBack就是双方约定的方法名

function register() {
    info就是前端给webview传的消息体
    webkit.messageHandlers.regcallBack.postMessage(info);
}

移动端的代码,需要在WKWebView初始化的地方加上设置,同时需要遵循代理 WKScriptMessageHandler

let config = WKWebViewConfiguration()
let userContent = WKUserContentController()
userContent.add(self, name: "regcallBack") regcallBack就是与前端约定好的方法名
config.userContentController = userContent
let myWebView = WKWebView(frame: .zero, configuration: config)

一旦h5传值过来了,这个代理方法就是可以直接获取h5传过来的值

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
   if message.name == "regcallBack" {
       print(message.body)
       message.body就是h5传过来的消息体
   }
}

2、UIWebView

前端代码

function sendParam(){
    var url="param:"+"丁丁风";
    document.location = url;//发送参数
 }

webview这边只需要在代理方法监听就行

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
      let url = request.url?.absoluteString
      if url?.contains("param") == true {
            如果包含,证明传值成功,接下来就是分割字符串了
      }
      return true
}

结束


跟h5交互在平常开发里面是经常遇到的,所以我在这里记录一下。希望可以帮到有需要的人