我们正在为iOS开发混合应用程序。大多数应用程序是在UIWebView中运行的WebApp。有时,应用程序的本机部分需要修改URL,添加一些参数。我知道我们可以使用“备用”解决方案(例如,本机应用程序与我们的服务器独立于webview进行对话);但是,我主要对一个好的& URL增强的安全解决方案。
我一直在寻找“最好”的技术来做到这一点,发现两个似乎(大部分)工作。
技巧#1 - 重新初始化网址
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"GOTO: %@", [[request URL] absoluteString]);
NSURL * oldurl = request.URL;
[[request URL] initWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]];
return YES;
}
技巧#2 - 拒绝第一个网址,然后选择新网址
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL * oldurl = request.URL;
if ([self isFixed:oldurl]) {
return YES;
} else {
NSURL * newurl = [NSURL URLWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]];
[theWebView loadRequest:[NSURLRequest requestWithURL:newurl]];
return NO;
}
}
技术#2似乎会在某些页面上造成瑕疵(“iFrame加载中断”,可能还有其他问题)。
我很好奇是否有其他人像这样做了网址替换,或是通过其他技术,或者是否有人知道技术#1的问题(我希望可以使用)。
我知道不建议使用方法调整,Apple的文档建议不要对UIWebView进行子类化。
谢谢!
更新 哎呀 - 技术#1实际上不起作用。我的实际代码比我发布的更多,而且它似乎只能起作用......这可能是个好消息,因为它有点像我想要的更邪恶。
答案 0 :(得分:1)
永远不要在已经初始化的对象上调用-init
方法。这不是定义的行为。你很可能在这里泄漏了内存,因为旧的请求可能没有正确发布。
通常首选类似于第二种方法的东西。
另一种方法是使用NSURLProtocol
将自己注入URL加载过程。这样做,您可以使用修改后的NSURLConnection
创建自己的NSURLRequest
。
答案 1 :(得分:0)
这是尝试的另一种方式。我正在玩stringByEvaluatingJavaScriptFromString:
,发现我可以这样做:
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *oldUrlString = [NSString stringWithFormat:"%@", request.URL.absoluteURL];
if ([oldUrlString isEqualToString:@"http://www.google.com/"])
{
[webView stringByEvaluatingJavaScriptFromString:@"window.location = \"http://www.arstechnica.com\""];
return NO;
}
return YES;
}
我设法使用javascript注入重定向,第一次请求www.google.com被拒绝,并重定向到www.arstechnica.com(我刚选择了一个随机网站)。
我认为它比在运行中热交换URL稍微好一些。