这篇文章是我从自己的新浪博客搬迁过来的,因为无法自动搬迁所以就自己动手了。
近期做了个项目里面需要加载网页,里面要求点击网页然后ios可以响应,点击ios的界面可以调用html5的代
码。为了实现这个要求,并且尽量做到代码的复用就自己实现了个类继承自UIWebView。
首先我是采用javaScroptCore这个系统库实现原生和html5交互的。并且写了个协议用来进行类跟类间的通信的。
看.h的部分代码:
#import //这是引入库
@protocol FWWebViewDelegate //这是代理
@optional
//点击网页ios响应
- (void)clickWebViewIosResponesWebView:(UIWebView *)webView andJSContent:(JSContext *)context;
//获取网址,标题
- (void)haveTitleString:(NSString *)title andUrlString:(NSString *)urlString;
//从web网页返回到iOS页面
- (void)webViewBackToiOSView;
@end
@property (nonatomic,weak)id fwDelegate; //代理
@property (nonatomic,copy)NSString *initializeWebViewUrlString; //初始化的网址
@property (nonatomic,copy)NSString *currentWebViewTitle; //当前网页标题,可以使用get方法取值
@property (nonatomic,copy)NSString *currentWebViewUrlString; //当前网页网址,可以使用get方法取值
- (instancetype)initWithFrame:(CGRect)frame andUrlString:(NSString *)urlString;
//iOS调用html5的方法
- (void)iOSUserHtmlActionByJavaScriptString:(NSString *)jsStringl;
//当前网页返回功能,可以返回到上一页或ios页面
- (void)webViewBackToAnotherOriOSView;
接下来看.m文件的部分代码:
在加载网页结束的代理方法中可以获取当前网页的标题,网址以及创建JSContext
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//获取了标题和网址
if ([self.fwDelegate respondsToSelector:@selector(haveTitleString:andUrlString:)]) {
_currentWebViewTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
_currentWebViewUrlString = webView.request.URL.absoluteString;
[self.fwDelegate haveTitleString:_currentWebViewTitle andUrlString:_currentWebViewUrlString];
}
//如果点击h5,iOS需要响应则执行下面代码
if ([self.fwDelegate respondsToSelector:@selector(clickWebViewIosResponesWebView:andJSContent:)]) {
JSContext *context = [self valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
[self.fwDelegate clickWebViewIosResponesWebView:self andJSContent:context];
}
}
iOS调用html5的方法:
#pragma mark ----iOS调用html5的方法----
- (void)iOSUserHtmlActionByJavaScriptString:(NSString *)jsStringl {
[self stringByEvaluatingJavaScriptFromString:jsStringl];
}
封装好的网页的返回按扭
#pragma mark ----网页的返回功能------
- (void)webViewBackToAnotherOriOSView {
if (_currentWebViewUrlString == nil || [_currentWebViewUrlString isEqual:_initializeWebViewUrlString]) { //当前网页无法加载或是首页时直接返回到iOS页面
if ([self.fwDelegate respondsToSelector:@selector(webViewBackToiOSView)]) {
[self.fwDelegate webViewBackToiOSView];
}
}else {
[self goBack]; //链接的返回
}
}
关于context的回调简单的说明一下
context[@"showCreateDialog"] = ^(NSInteger gameID){
[self.navigationController popToViewController:self.menuController animated:YES];
self.menuController.isComplete = gameID;
};
showCreateDialog是服务端给的关于你点击的网页的html5的回调方法,至于block的参数看需求可以要也可以不要
关于iosd调用HTML5的方法简单说明一下timeString这个参数是你将要调用HTML5的函数的函数名:
NSString *js = [NSString stringWithFormat:@"%@('%@')",timeString,dateString];
[_webView stringByEvaluatingJavaScriptFromString:js];