iOS--常用控件--WebView与js相互调用
2015-09-14 17:07
246 查看
由于native在开发和维护及速度上相比较Web还是差了一大截,Web也日渐成熟,移动端硬件性能也越来越高. 很多App嵌入Web由原来的技巧性东西现在成为一个趋势, 更有可能native日渐会被HTML5所代替.
第一次接触在应用中嵌入Web,是在研发输入法的时候, 有个About页面(PC端),这个页面就是使用Web, 本地缓存+外链, 这样更新内容时就不需要升级应用了.现如今HTML5被广泛利用, 尤其数据展示方面以及 频繁改动比较大的时候可以充分利用Web的灵活性.
这篇博文主要针对两点
1.native代码调用js
2.js调用native
要实现ios和js的互调, 就必须有web代码. 比方说我们从ios调用js开始, 在web中实现一个简单的函数:
在ios中加上这么一行代码:
对,上面这一小行代码native就可以和js进行通信了,其中showDivMsg为js中的函数.
对于
这个方法的参数是传入一个script, 比方说你可以直接alert.
对于这个webview,script操作的内存是在10M之内. 不然webview就会抛异常了.
加载html的时候,使用loadRequest方法,该方法进行异步加载
从js中调用本地关键在于函数中调用window.location=uri,然后在iOS中就会收到shouldStartLoadWithRequest的消息. 在WebView加载新界面的时候会调用此方法, 所以使用了 window.location,同样使用iframe也是一样的.
互相调用的时候,不仅要能够调用互相的方法(函数), 还要能够进行传参 ,首先NSURL有三个属性, 分别是:
scheme
The scheme for the NSURL object. For example, in the URL http://www.example.com/index.html, the scheme is http.
host
The host for the NSURL object (for example, www.example.com). May be the empty string.
path
The path for the NSURL object (for example, /index.html). If the path begins with a tilde, you must first expand it by calling stringByExpandingTildeInPath.
操作如下:
所以思路是 host为调用的方法, fragment为传的参数.
如下为fragment(使用jsonString来传参. ios.method为host)
整体思路就是这样, 具体代码可见自己写的一个demo:
https://github.com/InfoGeeker/phoneGap
本文出自:http://vimer.me/articles/iOS方法与javascript函数互相调用.html
第一次接触在应用中嵌入Web,是在研发输入法的时候, 有个About页面(PC端),这个页面就是使用Web, 本地缓存+外链, 这样更新内容时就不需要升级应用了.现如今HTML5被广泛利用, 尤其数据展示方面以及 频繁改动比较大的时候可以充分利用Web的灵活性.
这篇博文主要针对两点
1.native代码调用js
2.js调用native
要实现ios和js的互调, 就必须有web代码. 比方说我们从ios调用js开始, 在web中实现一个简单的函数:
1 2 3 | function showDivMsg(msg) { $('msg').innerHTML = msg; } |
1 | [self.webView stringByEvaluatingJavaScriptFromString:@"showDivMsg('iOS中调用js,Success!')"]; |
对于
1 | - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; |
1 | stringByEvaluatingJavaScriptFromString:@"showDivMsg('alert('ok')'); |
加载html的时候,使用loadRequest方法,该方法进行异步加载
1 2 | NSString *path = [[NSBundle mainBundle] pathForResource:@"www/index" ofType:@"html"]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path]]]; |
1 2 3 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType) { //..... } |
scheme
The scheme for the NSURL object. For example, in the URL http://www.example.com/index.html, the scheme is http.
host
The host for the NSURL object (for example, www.example.com). May be the empty string.
path
The path for the NSURL object (for example, /index.html). If the path begins with a tilde, you must first expand it by calling stringByExpandingTildeInPath.
操作如下:
1 2 3 4 5 | (NSURLRequest *)request NSString* scheme = request.URL.scheme; NSString* method = request.URL.host; NSString* fragment = [[request.URL.fragment stringByReplacingOccurrencesOfString:@"+" withString:@" "] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; |
如下为fragment(使用jsonString来传参. ios.method为host)
1 2 3 4 | var obj = new Object(); obj.msg = msg; var JSONString = JSON.stringify(obj); var uri = 'phoneGap://ios.method#' + JSONString; |
https://github.com/InfoGeeker/phoneGap
本文出自:http://vimer.me/articles/iOS方法与javascript函数互相调用.html
相关文章推荐
- ffmpeg在iOS的使用 - iFrameExtractor源码解析
- iOS 警告收录及科学快速的消除方法
- 全面了解 iOS 静态库开发
- framework not found XCTest
- ios arc下内存管理
- FIRST TODY STAR
- iOS运动事件学习
- iOS内存管理 ARC与MRC
- IOS 开发,调用打电话,发短信,打开网址
- IOS启动其他应用程序
- IOS中延时执行的几种方式的比较和汇总
- ffmpeg在iOS的使用 - iFrameExtractor源码解析
- iOS 数据持久化-CoreData
- iOS 开发之 导航控制器
- iOS开发日记18-runtime高级篇
- iOS进阶----block的使用
- IOS设置导航栏全局的背景图片、导航栏title文字颜色大小、导航栏左右按钮的颜色。
- IOS不用AutoLayout也能实现自动布局的类(4)----MyTableLayout表格布局
- IOS不用AutoLayout也能实现自动布局的类(2)----MyFrameLayout 框架布局
- IOS不用AutoLayout也能实现自动布局的类(3)----MyRelativeLayout 相对布局