对iOS的UIWebView的封装,实现与html5的交互

这篇文章是我从自己的新浪博客搬迁过来的,因为无法自动搬迁所以就自己动手了。
近期做了个项目里面需要加载网页,里面要求点击网页然后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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值