首发:个人博客,更新&纠错&回复

1.本地语言调js的方式与android中的方式类似,也是向WebView控件发送要调用的js语句
2. 但js调本地语言,则不是像android那样直接调一个全局变量的方法,而是通过location.href=xx://yy这样的方式触发UIWebViewDelegate接口实现者的webView shouldStartLoadWithRequest navigationType方法,该方法应该判断目标路径(即xx://yy)的schema(即xx)是否实际是要调用swift,如果是,则按约定执行之,并返回false阻止网页路径变化,如果不是要调用swift,则返回true,让改网页继续正常加载目标url。
android和iOS对比,它们都用了伪url的技术,但android是在本地语言调js时使用了伪url(该url的schema为javascript),而iOS是js调本地语言时使用了伪url(该url是自定义的标识),这个错落很有意思。
 
 

swift代码:

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

@IBOutlet weak var theWebView: UIWebView!

override func viewDidLoad() {

//加载本地html

let res = NSBundle.mainBundle().pathForResource("index",ofType:"html")

let url = NSURL(fileURLWithPath: res!);

let request = NSURLRequest(URL: url);

self.theWebView.loadRequest(request);

self.theWebView.delegate = self;

}

//让js可以调用swift

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

//判断是不是js在调用swift,如果是,则处理并返回false

if(request.URL!.scheme == "myschema"){

let host = request.URL!.host;

if(host == "go"){

let query = request.URL!.query!;

print(query);

let split = query.componentsSeparatedByString("=");

let text = split[1];

self.theWebView.stringByEvaluatingJavaScriptFromString("changeContent(\"" + text + "\")");

}

return false;

}else{

return true;

}

}

//swift调用js

@IBAction func btnClicked(sender: AnyObject) {

self.theWebView.stringByEvaluatingJavaScriptFromString("changeContent(\"123\")");

}

}

网页代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<span id="theSpan"></span>

<button onclick="doIt()">js调用swift</button>

<input type="text" id="t">

<script>

//让swift可以调用js

function changeContent(str){

document.getElementById('theSpan').innerHTML = str;

}

//js调用swift

function doIt(){

document.location.href = "myschema://go?a=" + document.getElementById("t").value;

}

</script>

</body>

</html>

长期欢迎项目合作机会介绍,项目收入10%用于酬谢介绍人。新浪微博:@冷镜,QQ:908789432

最新文章

  1. Java线程中带有返回值的线程Callable
  2. Python脚本模拟登录网页之ZiMuZu篇
  3. R----ggplot2包介绍学习
  4. Java设计模式——适配器模式
  5. php进程的SIGBUS故障
  6. 为您的Android,iOS等应用加入声波传输功能
  7. grunt学习
  8. python:学习defaultdict,namedtuple
  9. aul 学习测试(测量)
  10. caffe卷积输入通道如何到输出通道
  11. 禁止Linux系统被 ping
  12. 我的第一个python web开发框架(4)——数据库结构设计与创建
  13. Java基础(五)-Java序列化与反序列化
  14. MPC学习笔记1:基于状态空间模型的预测控制(1)
  15. 洗礼灵魂,修炼python(61)--爬虫篇—【转载】requests模块
  16. zookeepeer使用zkCli.sh命令
  17. 7、nginx的upstream及fastcgi模块应用
  18. 关于synchronized和lock 的使用及其在线程间的通信
  19. SQL 复习笔记 MSSQL篇
  20. YOLO V3论文理解

热门文章

  1. iOS开发三步搞定百度推送
  2. 关于tag标签系统的实现
  3. 接口(Java)
  4. c++ 符号执行顺序小例子
  5. Js分页插件,支持页面跳转
  6. HTML静态网页 格式与布局
  7. log4net 添加自定义日志到数据库
  8. linux笔记三-------根目录相关说明
  9. IntelliJ 有的时候移动滚动条后会自动回到光标所在位置的解决方法
  10. JDBC使用MySQL存储过程错误