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

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

IOS UIWebView与js的简单交互swift3版的更多相关文章

  1. iOS web与js的简单交互

    我们在封装网页的时候经常会遇到需要往网页里面的控件添加数据,但是怎么添加又成了难点.本人最近在开发的时候就遇到这样的事,解决之后,来和大家分享一下. //以必应网站为例 [web loadReques ...

  2. UIWebView与JS的深度交互

    我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img &g ...

  3. UIWebView与JS的深度交互-b

    要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > ...

  4. 史上最全的 UIWebview 的 JS 与 OC 交互

    来源:伯乐在线 - 键盘风筝 链接:http://ios.jobbole.com/89330/ 点击 → 申请加入伯乐在线专栏作者 其实一直想给大家整理一下JS与OC的交互,但是没有合适的机会,今天借 ...

  5. iOS 使用node js 搭建简单的本地服务器

    一.前提:基于iOS 项目 调用,使用了第三方框架NodeMobile.技术说明关键是 应用生命整个周期只能在应用启动时候开辟的一个线程里申请 一个 node  js 资源.如果终止了运行,重启是不支 ...

  6. iOS UIWebView中javascript与Objective-C交互、获取摄像头

    UIWebView是iOS开发中常用的一个视图控件,多数情况下,它被用来显示HTML格式的内容. 支持的文档格式 除了HTML以外,UIWebView还支持iWork, Office等文档格式: Ex ...

  7. UIWebView中JS与OC交互 WebViewJavascriptBridge的使用

    一.综述 现在很多的应用都会在多种平台上发布,所以很多程序猿们都开始使用Hybrid App的设计模式.就是在app上嵌入网页,只要写一份网页代码,就可以跑在不同的系统上.在iOS中,app多是通过W ...

  8. iOS UIWebView 中 js调用OC 打开相册 获取图片, OC调用js 将图片加载到html上

    线上html <!DOCTYPE html> <html> <head> <title>HTML中用JS调用OC方法</title> < ...

  9. iOS UIWebView与JavaScript的交互 相关资料

    UIWebView自适应宽度 iOS UIWebView中javascript与Objective-C交互.获取摄像头 iOS中JavaScript和OC交互 iOS与js交互,获取webview完整 ...

随机推荐

  1. C++quickSort

    void QuickSort1(int *s,int left,int right){ int i,j,t,pivot; if(left>right) return; if(left<ri ...

  2. codeforces 553A A. Kyoya and Colored Balls(组合数学+dp)

    题目链接: A. Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes i ...

  3. 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树和一个和,判断这个树 ...

  4. CodeForces - 1019D(BZOJ3707圈地):Large Triangle (几何,找面积为S的三角形)

    题意:给定平面上N个点,问是否存在三角形,其面积为S. 思路:选择Y轴,枚举这个Y轴,面积大小只与|y-Y|有关,然后二分,具体的可以先去做BZOJ3707. 具体的: 1,先对点排序,X坐标为第一关 ...

  5. 每天一个linux命令(13):more命令

    版权声明更新:2017-05-17博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  6. http之pragma

    关于Pragma:no-cache,跟Cache-Control: no-cache相同.Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是htt ...

  7. cs2008中头文件交叉编译的问题

    使用全局变量 使用基类指针定义在头文件中,在实际使用中强制转型为需要的指针,当然应该也可以存为空指针.

  8. java web项目创建

    https://www.cnblogs.com/kangjianwei101/p/5621738.html

  9. 插曲一--记《数据结构与问题求解(Java语言版)(第4版)》翻译问题

    在该书的527页中18.6理论题中,书中这样写道"完全结点是指每个结点都有两个孩子.证明,完全二叉树的结点数加1等于叶子树." 初看此题目,本人觉得很纳闷,再细细想之,发现似乎是个 ...

  10. BluetoothFindFirstRadio 函数

    HBLUETOOTH_RADIO_FIND BluetoothFindFirstRadio( BLUETOOTH_FIND_RADIO_PARAMS* pbtfrp, HANDLE* phRadio ...