iPhone开发-点击UIWebView的链接地址时,更改链接地址

缘起

在开发的时候,有时会需要加载很多webview,当然webview的内容即可以是本地的html也可以是远端服务器的内容,随需求而选择需要用哪一种。

前两天因为开发的需要,需要将一个应用A,转换成一个新应用B,A和B中大部分功能是相同的,只是B中加了些新功能,所以B的代码是基于A的基础上添加的。A中有些功能需要调用webview,点击webview中的某些超链接会跳到A中的相应的页面,例如超链接的地址是a://app?gocontrol1。这样问题就来了(当然不是学挖掘机哪家强?),当用户在B应用的webview中点击该超链接时会怎么样呢?答案是如果该手机装了A应用,则会跳到A应用,如果没装则跳到B指定的页面,应用乱跳了,这可不是咱们想要的结果。那怎么办呢?最直接的办法是改服务端的网页内容,将所有的超链接地址a://**改为b://**,但是如果这样的webview如果少就直接改了(即直接通过服务器判断A或B之后返回A或B的内容),但是这样的界面有10多个,如果改,会增加服务器端很大的工作量,老大经过思索,决定还是改B客户端的代码,将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;
}


另 将B客户端中info中的url schemes中的a改为b 如下图


尾声

以正合,以奇胜。改服务器端的网页内容是最直接的方法,但是代价也有些大,直接改客户端点击后的链接地址,快捷方便简单,何乐而不为呢?如果有其他的意见,欢迎讨论。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。