zoukankan      html  css  js  c++  java
  • IOS UIWebView与js的简单交互swift3版

    在开发过程中,我们可能遇到ios代码与js交互的情况,本人第一次使用遇到了很多坑,这里纪录一下,方便自己,也方便需要的人。

     

    1.第一步先建一个接口(协议)并继承JSExport

      这里实现两个方法提供给js调用的方法

    import JavaScriptCore

     

    @objc protocol  SwiftJavaScriptDelegate:JSExport{

        

           

         func show()

         func showAlert(_ str:String,_ msg:String)

        

        

    }

     

    2.第二步需要写一个类去实现上一步的接口(协议)(注意:1.这里必须要继承nsobject否则会报错,2.如果要传参数的话一定要写成

    类似与 func showAlert(_ str:String,_ msg:String),  _ str:String 这个“_”一定要加不然无法调用(调用无效果),在swift3.0中就这样,其他版本没有测试就不清楚了。

     

    @objc class SwiftJavaScriptModel:NSObject,SwiftJavaScriptDelegate{

     

        func show() {

            

            print("js调用我了")

        }

        

        func showAlert(_ str:String,_ msg:String){

        

        

            print("js调用我了:",str,msg)

        }

    }

     

    3.开始在控制器中测试

     

    //

    //  ViewController.swift

    //  WEBJSTest

    //

    //  Created by admin on 17/8/5.

    //  Copyright © 2017 tdin360. All rights reserved.

    //

     

    import UIKit

    import WebKit

    import JavaScriptCore

     

    class ViewController: UIViewController,UIWebViewDelegate{

     

        var  context:JSContext!

        

        override func viewDidLoad() {

            super.viewDidLoad()

     

            self.setupUI()

         

        }

        

        func setupUI( ) {

            

            self.view.addSubview(webView)

            

            let url = Bundle.main.path(forResource: "index", ofType: "html")

            

            self.webView.loadRequest(URLRequest(url: URL(string:url!)!))

            

            self.webView.delegate=self

            

            

            self.view.addSubview(btn)

            

            

        }

        

        lazy var webView:UIWebView={

            

            

            let webView = UIWebView(frame:self.view.bounds)

            

            return webView

            

        }()

        

        //用于点击调用js的按钮

        lazy var btn:UIButton={

        

            

            let btn = UIButton(frame:CGRect(x:0,y:300,100,height:40))

            btn.backgroundColor=UIColor.blue

            btn.setTitle("调用js", for: .normal)

            btn.addTarget(self, action: #selector(onClick), for: .touchUpInside)

        

        return btn

        }()

        

        

        //swift调用js

        func onClick()  {

     

           let f = context?.objectForKeyedSubscript("swift")

            _=f?.call(withArguments: [["name":"admin","pass":"fdsfds"]])

            

            

        }

        

        

        func webViewDidFinishLoad(_ webView: UIWebView) {

            

            

            let model = SwiftJavaScriptModel()

            

                  //获取context

                  context = self.webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext

           

              //这里注册一个标示给js访问

              context.setObject(model, forKeyedSubscript:"model" as (NSCopying & NSObjectProtocol)!)

            

            let url = Bundle.main.url(forResource: "index", withExtension: "html")

             context.evaluateScript(try? String(contentsOf: url!, encoding: String.Encoding.utf8))

            context.exceptionHandler = {

                (context, exception) in

                print("exception 错误@", exception ?? "")

            }

        }

        

     

        override func didReceiveMemoryWarning() {

            super.didReceiveMemoryWarning()

     

        }

     

     

    }

     

    4.html代码

     

    <!DOCTYPE html>

    <html lang="en">

        <head>

            <meta charset="UTF-8">

                <title>Title</title>

                <script>

                    

     

              //这个提交给swift调用并传参数

                function swift(obj){

                

                

                alert("swift调用我了"+obj["name"]+"--"+obj["pass"]);

                }

                

                </script>

        </head>

        <body>

            

            <h1>html</h1>

            <button onclick="model.showAlert('参数1','参数2')">调用swift(有参数)代码</button>

            <button onclick="model.show()">调用swift(无参数)代码</button>

        </body>

    </html>

     

    这里贴了源码,如果遇到问题欢迎留言,有什么更好的方法欢迎一起交流。

     

  • 相关阅读:
    转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
    今天解决的两个问题
    C++中指针和引用的区别
    负载均衡服务器session共享的解决方案 (转载)
    Entity Framework的默认值BUG解决方法
    【转】SAPI中的IspeechRecoContext(接口)
    Sapi 添加语法的文章(转载)
    SAPI训练文件存储位置
    Flask第九篇 Flask 中的蓝图(BluePrint)
    Flask 第八篇 实例化Flask的参数 及 对app的配置
  • 原文地址:https://www.cnblogs.com/zzjbk/p/7293842.html
Copyright © 2011-2022 走看看