iPhone开发-点击UIWebView的链接地址时,更改链接地址
缘起
在开发的时候,有时会须要载入非常多webview,当然webview的内容即能够是本地的html也能够是远端server的内容。随需求而选择须要用哪一种。
前两天由于开发的须要,须要将一个应用A,转换成一个新应用B,A和B中大部分功能是同样的,仅仅是B中加了些新功能。所以B的代码是基于A的基础上加入的。
A中有些功能须要调用webview,点击webview中的某些超链接会跳到A中的对应的页面。比如超链接的地址是a://app?gocontrol1。这样问题就来了(当然不是学挖掘机哪家强?),当用户在B应用的webview中点击该超链接时会怎么样呢?答案是假设该手机装了A应用。则会跳到A应用。假设没装则跳到B指定的页面。应用乱跳了,这可不是咱们想要的结果。那怎么办呢?最直接的办法是改服务端的网页内容。将全部的超链接地址a://**改为b://**,可是假设这种webview假设少就直接改了(即直接通过server推断A或B之后返回A或B的内容)。可是这种界面有10多个,假设改,会添加server端非常大的工作量,老大经过思索,决定还是改Bclient的代码,将B的webview中点击后的超链接的地址由a://**转换为b://**,这样就能够通过最少的人力达到想要的效果。
实施
在UIWebView中点击某个超链接时,希望改变超链接的地址(当然这是比較非常规的操作。可是有些妙招有时会节省非常多时间)。想要监听UIWebView中的超链接的事件。首先得设置UIWebView的delegate为当前的Controller,即
myBWebView.delegate = self;
之后找到UIWebView的点击超链接的回调
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}之后在该回调中取出超链接的地址
NSURL *url = request.URL;
由于超链接中能够有其它非跳转到本应用页面的链接地址。比如http://www.baidu.com什么的,所以须要找出以a://**的超链接地址
if ([[url scheme] isEqualToString:@"aichang"]) {}获取到了超链接地址了。下一步就是改变url的scheme,使之变成b。代码例如以下
NSString *newUrlString = [NSString stringWithFormat:@"b://%@%@", url.host, url.path]; if (url.query) { newUrlString = [newUrlString stringByAppendingFormat:@"?%@", url.query]; } url = [NSURL URLWithString:newUrlString];
好了,新的url就是咱们须要的的url了,全程代码整理例如以下:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // Determine if we want the system to handle it. NSURL *url = request.URL; if ([[url scheme] isEqualToString:@"a"]) { NSString *newUrlString = [NSString stringWithFormat:@"b://%@%@", url.host, url.path]; if (url.query) { newUrlString = [newUrlString stringByAppendingFormat:@"?%@", url.query]; } url = [NSURL URLWithString:newUrlString]; if ([[UIApplication sharedApplication]canOpenURL:url]) { [[UIApplication sharedApplication]openURL:url]; return NO; } } return YES; }
尾声
以正合,以奇胜。
改server端的网页内容是最直接的方法,可是代价也有些大,直接改client点击后的链接地址。快捷方便简单。何乐而不为呢?假设有其它的意见,欢迎讨论。