加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift 开发UIWebView跟JS的交互

发布时间:2020-12-14 06:05:35 所属栏目:百科 来源:网络整理
导读:前言 作为小白的我,才开始入门IOS,选择了swift来进行入门学习,学习做着公司一个简单的小小项目,该项目需要进行跟H5进行交互,然后我就开始研究了UIWebView的使用,其实基本原理跟Android的一样,因为我是Android开发的,所以就顺水推舟了。 基础认知: J

前言

作为小白的我,才开始入门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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读