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;
}


另 将Bclient中info中的url schemes中的a改为b 例如以下图


尾声

以正合,以奇胜。

改server端的网页内容是最直接的方法,可是代价也有些大,直接改client点击后的链接地址。快捷方便简单。何乐而不为呢?假设有其它的意见,欢迎讨论。

posted on 2017-04-17 15:32  ljbguanli  阅读(158)  评论(0编辑  收藏  举报