想要的macOS上面Webview的素材缈如黄鹤

2.载入网页

  1. 能够直接导向到有个别网页,也能够先在地面运营二个静态页面文件,后续一些行事能够在地头静态网页中用js管理。这种艺术是相当多用的,因为程序运营速度会认为到快的比很多。

        let path = Bundle.main.path(forResource: "somepage", ofType: "html")
        let url = NSURL.fileURL(withPath: path!)
        let request = URLRequest(url: url);
        self.webView.mainFrame.load(request);
  1. 把somepage.html加多到项目,并在项目设置中Build Phases->Copy
    Bundle
    Resources中增添上文件somepage.html,那样结尾生成app文件的时候,somepage.html文件才会被打包到其中。
  2. 如若成立的品种接纳沙箱(sandbox)格局,今后的选用,假使想上App
    Store,一般是劫持供给使用沙箱的,须求在系统安装的Capabilities中允许incoming
    network/output
    networking。不然本地网页没难题,之后的其它网站都不或然访问。
  3. 新本子的macOS及iOS都强制必须接纳https网页访谈,若是需求帮衬老的http网页,还索要在Info.plist中追加一行:App
    Transport Security Settings,类型为字典项,个中扩大一项:Allow
    Arbitrary Loads,值为YES。
    做到上述4项,网页已经得以访问了。

相近是macOS10.10随后,以及iOS8随后,新面世的WKWebview组件就快快的代替了Webview及UIWebView。前者的确存在一些不可能消除的bug,诸如架构导致的速度迟滞和内部存款和储蓄器泄漏。
但爱莫能助制止的主题材料连连有个别,比如有些客户端软件,照旧须求合作老版本的类别,那时候,很不想行使,但也只可以还是把Webview塞到温馨的代码中。
互连网是个喜新厌旧的领域,网络寻找,差非常少独有两类。一是WKWebview的文书档案,二是iOS类的文档。想要的macOS上面Webview的素材缈如黄鹤。
由此部分只言片语的素材引导和大气的试验,终于成功了专门的工作。所以决定来烧烧冷灶,写出来记录一下。

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);
    }

想要的macOS上面Webview的素材缈如黄鹤。想要的macOS上面Webview的素材缈如黄鹤。前八个函数是基本的框架,在那之中第三个麻烦一些,随后实际上中国人民解放军海军事工业程大学业作的函数未有何样极度。
接着来寻访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>

想要的macOS上面Webview的素材缈如黄鹤。1.添加Webview

想要的macOS上面Webview的素材缈如黄鹤。最简易加多webview的秘籍便是间接在Interface
Builder中把Webview拖入到窗口同时用鼠标拖动到钦定地方和点名大小,随后在程序中增多对应的变量:

    @IBOutlet weak var webView: WebView!

假定必须动态程序落成,能够动用window.contentView?.addSubview(webView)把webview控件插入到分界面中。

3.从swift调用js

万一在网页中有如下内容:

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

其间定义了一个函数callFromSwift,当被调用的时候,在底下预订义的div中突显传入的字符串,並且重临二个字符串“msg
return from js”。
在swift中调用网页中的callFrom斯维夫特函数并获得其重返值能够如此做:

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

仿照效法资料:

Swift & JavaScript
integration

5.截获webview每三次访谈

跟下面类似,要再追加一个代理:

//初始化的时候增加:
        webView!.policyDelegate=self;

与此同期证明类的时候多贰个承袭:WebPolicyDelegate。随后代码中得以兑现贰个接口:

    func webView(_ webView: WebView!,
                 decidePolicyForNavigationAction actionInformation: [AnyHashable : Any]!,
                 request: URLRequest!,
                 frame: WebFrame!,
                 decisionListener listener: WebPolicyDecisionListener!) {
        NSLog("nav to %@",request.url!.absoluteString)  //这里是将要转向的网址
        listener.use()  //允许访问这个网址
        //listener.ignore()   //不允许访问这个网址则调用这个
    }

也不怎么程序中为了简化从js调用swift的职业量,会用链接的艺术,在链接地址中流传一些发令,就足以用那么些函数截获网站而且管理,被拍卖的网站日常使用listener.ignore()来禁止此番浏览器转向,免得影响当下页面。

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的警告窗来显示相关的信息。

7.其它

还足以兑现从js中拜望swift中的变量成效。使用isKeyExcludedFromWebScriptwebScriptNameForKey函数,笔者用得少,如若急需,参照他事他说加以考察上边定义函数的措施,查一查官方文书档案自个儿来尝试啊。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图