澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 澳门在线威尼斯官方分析Android中webview和js之间的

原标题:澳门在线威尼斯官方分析Android中webview和js之间的

浏览次数:113 时间:2019-09-26

4.从js调用swift

眼下的3片段都比较轻易,跟WKWebview也差不离。从JS到swift的调用要复杂的多了。
先是在初阶化的时候,要加多一句:

        webView!.frameLoadDelegate=self;

相应的,要在类注明的职责加上二个接续:WebFrameLoadDelegate,随后参与代码:

    //为js对象声明一个接口
    func webView(_ webView: WebView!, didClearWindowObject windowObject: WebScriptObject!, for frame: WebFrame!) {
        self.webView.windowScriptObject.setValue(self, forKey: "swiftHost")
    }
    //这个是基本框架,声明了本类中有两个函数会开放给js对象,并供其调用
    //这里示例了两个,一个是callFromJS1,另一个是quit
    //注意swift中的函数名跟js中的函数名可以不一样,
    //#selector中指明的是swift中声明的函数名,因为selector是object-c中的机制,
    //所以后面在声明真正函数的时候,前面必须加@objc的标志
    //在后面return "xxx"的部分,返回的字符串js中会使用的名字,
    //本例中,swift中函数名跟js中函数名使用了相同的名字,我认为这是好习惯
    override class func webScriptName(for aSelector: Selector) -> String?
    {
        //NSLog("%@",aSelector.description)
        if aSelector == #selector(callFromJS1)
        {
            return "callFromJS1"
        }
        else
        if aSelector == #selector(quit)
        {
            return "quit"
        }
        else
        {
            return nil
        }
    }
    //这个函数顾名思义,应当是不允许在js中调用的,对所有的来值都返回false表示全部允许调用
    override class func isSelectorExcluded(fromWebScript aSelector: Selector) -> Bool
    {
        //NSLog("%@",aSelector.description)
        return false
    }
    //具体的函数
    @objc
    func callFromJS1(message:String)
    {
        NSLog(message)
    }
    @objc
    func quit()
    {
        NSLog("call for quit")
        NSApp.terminate(self);
    }

前三个函数是核心的框架,在那之中第2个劳累一些,随后实际上中国人民解放军海军事工业程大学业作的函数未有何极其。
进而来拜望js的一部分:

    <a href='javascript:testCallSwift();'>testCallSwift</a><p>
    <a href='javascript:needQuit();'>Quit</a><p>
    <script>
        function testCallSwift(){
            //注意调用方式,window是js的对象
            //swiftHost是swift的接口
            //其后则是声明的swift函数
            window.swiftHost.callFromJS1("hello swift");
        }
        function needQuit(){
            window.swiftHost.quit();
        }
    </script>

4.Js中调用java函数并传参 先是一样须求带参数的函数方式,但需注意此处的参数须求final类型,即获得今后不可修改,倘若急需修改在那之中的值,能够先安装中间变量,然后开展改变。如下所示:

6.响应js中的警告窗

习感到常的webview都以不允许js中的alert警告窗的,一方面是为了应用程序全部的机能;另一方面,webview作为二个上空,本身未有UI的调控权,所以类似的办事,是要有应用程序本身达成警告框窗口的。完毕警告窗依旧要给类扩充一个合一WebUIDelegate,并在初叶化中扩张:

        webView!.uiDelegate=self;

//随后可以实现一个接口:
    func webView(_ sender: WebView!,
                 runJavaScriptAlertPanelWithMessage message: String!,
                 initiatedBy frame: WebFrame!){
        NSLog("msg of alert: %@",message)
    }

倘使不满足于只是猎取警示新闻,要团结在那一个函数中接纳cocoa的警示窗来展现相关的新闻。

2. 网页上调用android中java代码的法子 在网页中调用java代码,要求在webview控件中增添javascriptInterface。如下所示:

3.从swift调用js

只要在网页中有如下内容:

<script>
function callFromSwift(msg){
    document.getElementById('msgbox').innerHTML=msg;
    return("msg return from js");
}
</script>
<div id='msgbox'></div>

其间定义了二个函数callFrom斯维夫特,当被调用的时候,在底下预约义的div中显得传入的字符串,并且再次回到三个字符串“msg return from js”。
在swift中调用网页中的callFrom斯维夫特函数并获得其再次回到值可以那样做:

        let s=webView.windowScriptObject.evaluateWebScript("callFromSwift('Hello, JavaScript')")
        NSLog(s as! String) //s是js函数的返回结果,可以是多种类型,本例要求是string

mWebView.addJavascriptInterface(new Object() {
            public void clickOnAndroid(final int i) {
                mHandler.post(new Runnable() {
                    public void run() {
                                int j = i;
                                j++;
Toast.makeText(Test.this, "测量试验调用java" + String.valueOf(j), Toast.LENGTH_LONG).show();
                    }
                });
            }
        }, "demo");

恍如是macOS10.10从此,以及iOS8自此,新面世的WKWebview组件就快快的代表了Webview及UIWebView。前面一个的确存在有的不可能消除的bug,诸如架构导致的进程放慢和内部存款和储蓄器泄漏。
但不能够幸免的题目三回九转有些,比方某个顾客端软件,依然须要合作老版本的种类,那时候,很不想利用,但也只好依然把Webview塞到温馨的代码中。
网络是个喜新厌旧的圈子,英特网寻找,大概只有两类。一是WKWebview的文档,二是iOS类的文书档案。想要的macOS上边Webview的素材缈如黄鹤。
经过部分只言片语的材料指引和大批量的尝试,终于不辱职责了劳作。所以决定来烧烧冷灶,写出来记录一下。

下一场在html页面中,利用如下代码<div id='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div>,
就可以完成调用

参照他事他说加以考察资料:

Swift & JavaScript integration

复制代码 代码如下:

1.添加Webview

最轻松易行增加webview的形式就是一贯在Interface Builder中把Webview拖入到窗口同期用鼠标拖动到钦赐位置和钦命大小,随后在先后中加上对应的变量:

    @IBOutlet weak var webView: WebView!

万一非得动态程序实现,能够动用window.contentView?.addSubview(webView)把webview控件插入到分界面中。

3. Java代码调用js并传参 首先须要带参数的js函数,如function test(str),然后只需在调用js时传出参数就能够,如下所示:
mWebView.loadUrl("javascript:test('aa')");

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:澳门在线威尼斯官方分析Android中webview和js之间的

关键词:

上一篇:没有了

下一篇:没有了