2011-09-01 90 views
1

我们正在为iOS开发混合应用程序。大部分应用程序都是在UIWebView中运行的WebApp。有时需要应用程序的本机部分修改URL,添加一些参数。我知道我们可以使用“替代”解决方案(例如独立于Web视图的本地应用与服务器对话);不过,我主要对URL扩充的一个好的安全解决方案感兴趣。什么是最好(最安全)的方式来增加UIWebView使用的URL?

我一直在寻找“最好”的技术来做到这一点,并发现两个似乎(主要)工作。

技术#1 - 重新初始化URL

- (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 - 拒绝该第一URL和子在一个新

- (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(我希望使用)的问题。

我知道方法swizzling不推荐,并且Apple的文档建议不要继承UIWebView的子类。

谢谢!

UPDATE 哎呀 - 技术#1实际上没有工作。我的实际代码做得比我发布的还要多,而且它似乎只能工作......这可能是个好消息,因为我希望它有点邪恶。

+0

如果你想添加一个参数到一个URL这个代码是更坚实一点:http://stackoverflow.com/questions/7026916/passing-arguments-into-url-string-objective-c/7027608#7027608 – Jano

+0

啊,我会试一试这些技巧。有一点担心,那个职位没有被接受的解决方案。 – Dave

+0

@Jano,谢谢你的建议;然而,你的其他答案是简单地制作一个新的URL。我需要做的是更新将被UIWebView使用的URL。 – Dave

回答

1

永远不要在已经初始化的对象上调用-init方法。这是没有定义的行为。这很可能是你在这里泄漏内存,因为旧的请求ivars可能没有正确释放。

通常优选与第二种方法类似的东西。

另一种方法是使用NSURLProtocol将自己注入URL加载过程。这样做,您可以使用修改后的NSURLRequest创建自己的NSURLConnection

+0

我想更多地探讨这一点,因为我认为这可能是最“正确”的解决方案。不幸的是,在枪下一点,我现在正在使用我自己的技术#2。也许我会有时间尝试这种方法,并可以返回并对其进行评论。 (目前,不完全理解这些API,所以任何额外的指针将不胜感激。) – Dave

+0

我应该写一篇关于NSURLProtocol的博客文章。这是非常有用的东西。看一下'ProxyURLProtocol'就是一个非常接近你所做事情的例子。看看如何在'initWithRequest:...'我重写请求类似于你如何描述? https://github.com/PandoraBoy/PandoraBoy/blob/master/ProxyURLProtocol.m –

+0

谢谢,我会在周末看看! – Dave

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好一点。

+0

有趣。我想我可能会使用js注入来重新编写页面加载中的某些锚点。这看起来好像会起作用,可能比技术#2更清洁。 – Dave

相关问题