在开发过程中,我们可能遇到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,width: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>

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

最新文章

  1. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
  2. SpringMVC集成缓存框架Ehcache
  3. startssl,免费的ssl证书申请及注意事项
  4. Linux-第一天
  5. dom对象操作Html,Css
  6. 用jquery写了个选项卡,当作一个笔记吧。
  7. [CentOS 0010] CentOS 配置mysql允许远程登录
  8. ranlib的作用 -----更新静态库的符号索引表
  9. 95后实习生的远程办公体验(asp.net mvc\C#技术栈)
  10. [国嵌攻略][163][linux-usb软件系统架构]
  11. Linux 6.4 设置yum 为centOS源
  12. filter-api文档
  13. kernel笔记——定时器与时间管理
  14. jQuery-二级导航
  15. 写博的第一天 0x00
  16. POJ 1269 - Intersecting Lines - [平面几何模板题]
  17. bzoj4519: [Cqoi2016]不同的最小割(最小割树)
  18. 6.关于Xamarin Android对APK包大小的处理
  19. 【动态规划+Floyd】OpenJudge3368
  20. Android 自定义View-字母索引表(一)

热门文章

  1. sublime text _注册码
  2. php常用函数htmlspecialchars、strip_tags、addslashes解析
  3. 【HDU 6428】Calculate 莫比乌斯反演+线性筛
  4. hdu4699 Editor(双向链表或双栈对弹)
  5. Android中高效的显示图片之二——在非UI线程中处理图片
  6. ACM学习历程—SGU 275 To xor or not to xor(xor高斯消元)
  7. spark减少提交jar包处理
  8. chromedriver下载
  9. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu
  10. 三 volatile关键字