swift的WKWebView跟js互动调用js方法和弹出alert打开新窗口禁用手势等教程

54 篇文章 1 订阅

今天做公司项目网页程序里面调用手机的截图.跟公司网页端的同事合作完成了功能.

网页端的js给手机端发js方法的代码格式:

可以直接把下面代码复制给你的前端同事

try {
    //使用此方法,会报错,因此使用try-catch
    window.webkit.messageHandlers.方法名.postMessage(发送的消息内容);
} catch(error) {
    console.log('WKWebView post message');
}

例如下面自定义的方法"screenShotCellphone",发送的消息是"1"


try {
    //使用此方法,会报错,因此使用try-catch
    window.webkit.messageHandlers.screenShotCellphone.postMessage("1");
} catch(error) {
    console.log('WKWebView post message');
}

swift端接收js方法需要做的事

给WKWebView添加要捕获js的方法名

如果不添加方法名,下面的代理方法就不能够捕捉到
下面方法在控制器执行一次就行了,放在WKWebView初始化后面,下面添加的方法名字是自定义的js方法screenShotCellphone

wkWebView.configuration.userContentController.add(self, name: "screenShotCellphone") //添加js需要检测的方法

捕获js方法

让控制器遵守协议WKScriptMessageHandler
例如让ViewController遵守协议,写成扩展,当网页里面发送js的screenShotCellphone 方法的时候下面就会被调用.message.name是捕获方法名,message.body是捕获到的方法发送的信息

extension ViewController: WKScriptMessageHandler{
    //userContentController的协议方法:JS调用OC和swift 时会执行此方法
    //   userContentController  webview中配置的userContentController 信息
    //    @param message                JS执行传递的消息
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        //需要用wkWebView.configuration.userContentController.add 添加被检测的方法名字
        print("message=",message)
        print("message.webView=",message.webView)
        print("message.frameInfo=",message.frameInfo)
        print("message.name=",message.name) //方法名  得到"screenShotCellphone"
        print("message.body=",message.body) //参数 ,得到"1"
        
    }

swift端接收js的alert

遵守WKUIDelegate设置代理

wkWebView.uiDelegate = self

在代理方法里面写入接收alert的后续代码

注意,接收到alert以后必须调用completionHandler()方法,否则会报错,一般在点击完 “确定” 或者 "否"按钮以后调用这个方法,告诉系统已经点击完按钮了
下面代码 message是 js传过来的alert信息 runJavaScriptAlertPanelWithMessage是系统的代理方法

extension ViewController : WKUIDelegate{
    //网页alter信息
    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
        
        print("message=",message)
		//这里写你自己的ios alert方法,我的alert方法是自己封装的就不在这里写了
        completionHandler()// js的alert方法必须调用ios的completionHandler方法,否则报错

    }
}

swift 执行 js.open方法打开新窗口

当网页里面打开新的网页的时候,需要把WKWebView 用load方法再打开新的url.需要下面方法捕获到 js.open方法以后,再继续打开新网页

遵守WKUIDelegate代理

wkWebView.uiDelegate = self

重写代理方法,并且打开新的url

下面代码看着比较长,实际上核心内容就是一句 wkWebView.load(URLRequest(url: url)),就是让wkWebView打开新的网址,其他都是判断

extension ViewController : WKUIDelegate
    //用来接收 js的open方法
    //打开新网页的时候调用下面方法
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {

        if navigationAction.request.url != nil {
            let url = navigationAction.request.url
            if let urlPath = url?.absoluteString {
                print("urlPath=",urlPath)
                if (urlPath as NSString?)?.range(of: "https://").location != NSNotFound || (urlPath as NSString?)?.range(of: "http://").location != NSNotFound {
                    //如果找到https://或者 http://就打开网页
                    if let url = URL(string: urlPath ) {
                        wkWebView.load(URLRequest(url: url))
                    }
                }
            }
        }
        return nil
    }
}

直接用swift执行js

evaluateJavaScript方法可以直接执行js语句

例如下面代码是通过执行js,禁用WKWebView的缩放手势

 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值