什么是最好(最安全)的方式来增加UIWebView使用的URL?
我们正在为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实际上没有工作。我的实际代码做得比我发布的还要多,而且它似乎只能工作......这可能是个好消息,因为我希望它有点邪恶。
永远不要在已经初始化的对象上调用-init
方法。这是没有定义的行为。这很可能是你在这里泄漏内存,因为旧的请求ivars可能没有正确释放。
通常优选与第二种方法类似的东西。
另一种方法是使用NSURLProtocol
将自己注入URL加载过程。这样做,您可以使用修改后的NSURLRequest
创建自己的NSURLConnection
。
我想更多地探讨这一点,因为我认为这可能是最“正确”的解决方案。不幸的是,在枪下一点,我现在正在使用我自己的技术#2。也许我会有时间尝试这种方法,并可以返回并对其进行评论。 (目前,不完全理解这些API,所以任何额外的指针将不胜感激。) – Dave
我应该写一篇关于NSURLProtocol的博客文章。这是非常有用的东西。看一下'ProxyURLProtocol'就是一个非常接近你所做事情的例子。看看如何在'initWithRequest:...'我重写请求类似于你如何描述? https://github.com/PandoraBoy/PandoraBoy/blob/master/ProxyURLProtocol.m –
谢谢,我会在周末看看! – Dave
这是另一种尝试的方式。我与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好一点。
有趣。我想我可能会使用js注入来重新编写页面加载中的某些锚点。这看起来好像会起作用,可能比技术#2更清洁。 – Dave
如果你想添加一个参数到一个URL这个代码是更坚实一点:http://stackoverflow.com/questions/7026916/passing-arguments-into-url-string-objective-c/7027608#7027608 – Jano
啊,我会试一试这些技巧。有一点担心,那个职位没有被接受的解决方案。 – Dave
@Jano,谢谢你的建议;然而,你的其他答案是简单地制作一个新的URL。我需要做的是更新将被UIWebView使用的URL。 – Dave