JS和OC的交互

第一种方法,利用 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 文件





    





需要执行的代码
- (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];
};
}

你可能感兴趣的:(JS和OC的交互)