增加UIWebView使用的URL的最佳(最安全)方法是什么?

时间:2011-09-01 17:18:04

标签: iphone ios uiwebview

我们正在为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实际上不起作用。我的实际代码比我发布的更多,而且它似乎只能起作用......这可能是个好消息,因为它有点像我想要的更邪恶。

2 个答案:

答案 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稍微好一些。