swift 开发UIWebView跟JS的交互

前言

作为小白的我,才开始入门IOS,选择了swift来进行入门学习,学习做着公司一个简单的小小项目,该项目需要进行跟H5进行交互,然后我就开始研究了UIWebView的使用,其实基本原理跟Android的一样,因为我是Android开发的,所以就顺水推舟了。


基础认知:  

 JavaScriptCore类是IOS中提供与JS交互的一个框架,我们需要了解:

  • JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码
  • JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等
  • JSExport, JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用

swift代码块 




import UIKit
import JavaScriptCore
// 这里必须使用@objc,因为JavaScriptCore库是ObjectiveC版本的。如果不加@objc,则调用无效果
@objc protocol VideoJsDelegate:JSExport {
   
    func callCarpture(_ type : String , _ comId:String , _ a:String)//扫描
    func callShare()//分享
    func callPhone(_ phone:String)//拨打电话
    func getAddress()
}


@objc class VideoJsModel: NSObject, VideoJsDelegate {
    func getAddress() {
        
    }


    func callPhone(_ phone: String) {
        print("拨打电话.....")
    }


    func callShare() {
        
        
    }


    func callCarpture(_ type: String, _ comId: String, _ a: String) {
        print(comId)
        
    }


    var jsContext:JSContext!
    
}




class ViewController: UIViewController, UIWebViewDelegate {
    
    
    @IBOutlet weak var wevView: UIWebView!
    
     var jsContext: JSContext!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        wevView.delegate = self;
        self.wevView.scalesPageToFit = true
        wevView?.loadRequest(URLRequest.init(url: URL.init(string: "http://aabbbss.com")!))//这里设置你需要加载的地址
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    //webView代理方法,网页内容加载完成时调用
    func webViewDidFinishLoad(_ webView: UIWebView){
        print("加载完成。。。。。")
        
        let imei = "646184315135"
       
        webView.stringByEvaluatingJavaScript(from: "GetUserInfo('"+imei+"')")//调用H5的方法,这方法必须放到这个webViewDidFinishLoad方法执行完后才能调用
        self.jsContext = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext
        let model = VideoJsModel()
        
        model.jsContext = self.jsContext
        // 将Test注入到JS中,在JS让Test以对象的形式存在
        self.jsContext.setObject(model, forKeyedSubscript: "Test"  as NSCopying & NSObjectProtocol)


        let curUrl =  webView.request?.url?.absoluteURL
        
        jsContext.evaluateScript(try? String(contentsOf: curUrl!, encoding: String.Encoding.utf8))//WebView当前访问页面的链接 可动态注册
        
        jsContext.exceptionHandler = { (context, exception) in
            print("exception:", exception as Any)
        }
        
    }
    


}


以上代码是正常运行交互,前提是:VideoJsDelegate 中的方法中带有参数必须在前面加下划线,如果不加下划线,就没有效果,H5 调用不到本地的方法。


参考:

http://blog.csdn.net/sbt0198/article/details/54015914
http://blog.csdn.net/json_vip/article/details/51615029


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值