iOS UIWebView原生与JS交互
2017-12-20 10:29
357 查看
在iOS的开发中用webView加载网页是一种很常见的逻辑,有时候我们会在webView中对js的方法进行拦截从而进行自己的逻辑判断,有时候还会需要我们提供一些原生的方法供js进行调用,或者在网页加载完毕后调用一些js的方法来修改页面的逻辑。
首先加载webView
然后我们看一下UIWebView的四个代理方法
从这四个代理方法中我们可以看出来每次我们点击页面进行数据加载的时候都会调用shouldStartLoadWithRequest方法,所以我们可以在这个方法中对js的方法进行拦截,然后替换为自己的方法
还有一种方法是在页面加载完毕之后注入或者调用js的方法来修改原有的界面逻辑,或者定义一个原生的方法让js直接调用。注意下边的逻辑必须是要在页面加载完毕之后调用。
通过以上几种途径就可以实现我们开发中遇到的几乎所有的与js进行交互的逻辑
首先加载webView
self.webView = [[UIWebView alloc]init]; [self.view addSubview:self.webView]; self.webView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); // 自动对页面进行缩放以适应屏幕 self.webView.scalesPageToFit = YES; // 需要在代理方法中与js进行交互 self.webView.delegate = self; // 取消webView的弹簧效果 [(UIScrollView *)[[self.webView subviews] objectAtIndex:0] setBounces:NO]; NSString *urlStr = @"http://www.baidu.com/"; NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:urlStr]];
然后我们看一下UIWebView的四个代理方法
// 当点击页面进行加载数据的时候调用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; // 当页面开始加载的时候调用 - (void)webViewDidStartLoad:(UIWebView *)webView; // 当页面加载完成的时候调用 - (void)webViewDidFinishLoad:(UIWebView *)webView; // 页面加载失败的时候调用 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
从这四个代理方法中我们可以看出来每次我们点击页面进行数据加载的时候都会调用shouldStartLoadWithRequest方法,所以我们可以在这个方法中对js的方法进行拦截,然后替换为自己的方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 获取点击页面加载的url NSString *url = request.URL.absoluteString; if ([url rangeOfString:@"此处写想拦截的url字符串"].location != NSNotFound) { // 通过获取当前点击页面加载的url与指定url进行比较,拦截页面请求,进行自己的逻辑处理 // 进行移动端的逻辑处理 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"拦截页面方法" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil]; [alert show]; return NO; } return YES; }
还有一种方法是在页面加载完毕之后注入或者调用js的方法来修改原有的界面逻辑,或者定义一个原生的方法让js直接调用。注意下边的逻辑必须是要在页面加载完毕之后调用。
- (void)webViewDidFinishLoad:(UIWebView *)webView { // 获取当前网页的标题 NSString *titleStr = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; NSLog(@"%@",titleStr); // 还可以直接调用js定义的方法 // 比如getShareUrl()为js端定义好的方法,返回值为分享的url // 我们就可以通过调用这个方法在returnStr中拿到js返回的分享地址 NSString *returnStr = [webView stringByEvaluatingJavaScriptFromString:@"getShareUrl()"]; NSLog(@"%@",returnStr); // 还可以为js端提供完整的原生方法供其调用(记得导入#import <JavaScriptCore/JavaScriptCore.h>) JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 可以定义供js调用的方法, testMethod为js调用的方法名 context[@"testMethod"] = ^() { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"js调用方法" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil]; [alert show]; }); }; }
通过以上几种途径就可以实现我们开发中遇到的几乎所有的与js进行交互的逻辑
相关文章推荐
- Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)
- iOS原生代码通过webView与js脚本交互
- [IOS经验总结]UIWebView与JS之间的数据交互
- iOS开发--iOS原生与JS交互的几种方式对比
- iOS中使用UIWebView与JS进行交互
- iOS UIWebView 与 JavaScript 交互 代码实现 嵌入 js 脚本
- ios的UIWebView与js交互的有关知识
- iOS中原生APP与JS交互 之 WebViewJavascriptBridge 的简单用法
- 【iOS开发】UIWebView与JavaScript(JS) 回调交互
- IOS UIWebView转WKWebView中的js交互问题
- 原生APP中js怎样与Android和ios进行交互
- iOS JS交互--UIWebView与JS的交互
- iOS中UIWebView使用JS交互:实现图片的点击
- iOS开发UIWebView与原生网页的交互
- iOS网页-JS交互(UIWebView)
- IOS UIWebView与js的简单交互swift3版
- iOS中UIWebView使用JS交互(4月2日修改)
- JS与Objective-C交互(网页与原生交互---使用UIWebviewDelegate)
- iOS开发 - 第04篇 - 网络 - 07 - JS & jQuery & UIWebView和JS交互
- iOS开发中OC与JS交互(UIWebView)