关于交互网上方式有好多种, 万变不离其宗的就是实现delegate的方法,
那么我们来看看webView的代理.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;//已经开始加载
- (void)webViewDidFinishLoad:(UIWebView *)webView;//结束加载
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;//请求出错
有这么4个方法。
下面三个没有返回值的就不说了, 我们来看第一个
第一个在webV每次加载前都会被调用,如果返回NO,则表示不允许加载当前请求, 所以, 我们可以把请求判断写在这个方法里
@property (nonatomic, copy) NSString * requestPath;
@property (nonatomic, copy) NSString * pageUrl;//要请求的h5地址
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpWebView];
}
- (void)setUpWebView
{
NSURL * url = [NSURL URLWithString:_pageUrl];//_pageUrl
UIWebView * webView = [[UIWebView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
webView.scalesPageToFit = YES;
webView.delegate = self;
self.webView = webView;
NSURLRequest * request =[[NSURLRequest alloc]initWithURL:url];
[webView loadRequest:request];
[webView setUserInteractionEnabled:YES];
[self.view addSubview:webView];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString * requestPath = request.URL.path;
NSString * str = [request.URL absoluteString];
NSString * requestStr = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//转码,防止有空格
//判断是否为动态请求
if ([requestPath isEqualToString:@"/"]) {
_requestPath = requestPath;
}
if ([_requestPath isEqualToString:@"/"]) {
return YES;
}
//判断是否加载
if (![requestStr isEqualToString:_pageUrl]) {
NSString * productStr = [[requestStr componentsSeparatedByString:@"productId="] lastObject];
NSString * productId = [[productStr componentsSeparatedByString:@"&"] firstObject];
//判断 productId 是否存在, 不存在则不跳转
if ([productId isEqualToString:requestStr]) {
return YES;
}
[self pushToGroupDetailWithProductId:productId];
return NO;
}
return YES;
}
其中有涉及到一点点得动态请求, 顺便提一下, 主要是根据后缀来判断的,
顺便提一句,有些请求可能链接相同, 内容是会变的, webView自带缓存, 最好在结束加载的时候清一下缓存
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
MLog(@"页面加载完毕");
/**
* 清除UIWebView的缓存
*/
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}
相同点: 都是ASCII编码,都存在HTML代码,都能包含脚本语言代码,都存在Web服务器上
不同点:静态请求页面后缀一般以.htm或者.html结尾,而动态请求网页一般以.shtm或者.shtml结尾
注: 代码中判断动态请求的代码是可以省略的, 下边的代码也是可以实现的, 只是这样写效率会比不加好一点