第一种方法,利用 UIWebView 的 delegate方法
- (void)viewDidLoad {
[super viewDidLoad];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
[self.webView loadRequest:request];
self.webView.delegate = self;
}
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSURL *url = [request URL];
NSString *urlStr = [NSString stringWithFormat:@"%@",url];
NSLog(@"%@",urlStr);
return YES;
}
根据代理方法,当点击 html 页面的请求时,可以返回请求的 url ,
第二种方法是利用 JavaScriptCore
相关的几个类
/*
JS执行的环境,同时也通过JSVirtualMachine管理着所有对象的生命周期,每个JSValue都和JSContext相关联并且强引用context。
*/
#import "JSContext.h"
/*
JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象。我们对JS的操作都是通过它。并且每个JSValue都是强引用一个context。同时,OC和JS对象之间的转换也是通过它
*/
#import "JSValue.h"
/*
JS和OC对象的内存管理辅助对象。由于JS内存管理是垃圾回收,并且JS中的对象都是强引用,而OC是引用计数。如果双方相互引用,势必会造成循环引用,而导致内存泄露。我们可以用JSManagedValue保存JSValue来避免。
*/
#import "JSManagedValue.h"
/*
JS运行的虚拟机,有独立的堆空间和垃圾回收机制。
*/
#import "JSVirtualMachine.h"
/*
一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了。
*/
#import "JSExport.h"
要求: 加载 html 页面,点击页面上的按钮时,监听按钮的点击,实现自己的 OC 方法,
首先在本地有个 html 文件
<!DOCTYPE html>
<html>
<head lang='zh'>
<meta charset="UTF-8">
<script type="text/javascript" src="index1.js"></script>
</head>
<body>
<button onclick="hello()">点击我弹出hello</button>
</body>
</html>
需要执行的代码
- (void)viewDidLoad {
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *url = [NSURL fileURLWithPath:path];
NSString *htmlpath = [[NSBundle mainBundle] pathForResource:@"index1" ofType:@"html"];
NSString *htmlCont = [NSString stringWithContentsOfFile:htmlpath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:htmlCont baseURL:url];
self.webView.delegate = self;
}
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"hello"] = ^{
NSLog(@"哈哈哈哈哈哈啊哈哈");
self.view.backgroundColor = [UIColor greenColor];
UIAlertController *aler = [UIAlertController alertControllerWithTitle:@"点击了js按钮" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertaction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[aler addAction:alertaction];
[self presentViewController:aler animated:YES completion:nil];
};
}