如何覆盖webView可以处理的重定向数量。 Obj-C,可可

时间:2012-11-20 20:26:34

标签: objective-c cocoa redirect webview override

这真让我烦恼。我有一个webView,我试图把它加载到drive.google.com。但是,由于该站点上的重定向数量,webView不执行任何操作。我知道加载webView的代码有效,并且该URL是正确的,因为我收到了didFailWithProvisionalLoadWithError消息。这就是我知道这是重定向问题的方式。

我已经看了一遍,但却无法改变允许的重定向数量。我知道这是可能的,因为Safari可以处理它。必须有某种委托方法来覆盖。今天没有代码,因为我所有的搜索(价值4天)都让我一无所获。

如果有人有想法,请告诉我。仅供参考,这是Cocoa(WebView)不是cocoa touch(UIWebView)。感谢。

2 个答案:

答案 0 :(得分:3)

您一直在搜索的是

– webView:decidePolicyForNavigationAction:request:frame:decisionListener:

WebPolicyDelegate协议的一部分。

阅读WebPolicyDelegate的文档,特别是有关此委托方法的讨论。 WebPolicyDecisionListener的文档描述了您可以发送给侦听器的消息。您可以在此委托方法中标识重定向,并且可以指示决策侦听器使用或忽略它。

修改

我很欣赏这50分,但如果我没有帮助你解决问题,我几乎不认为我应该得到它们,这足以激励我坐下来试试你的问题。

我构建了一个小应用程序,一个不基于文档的应用程序,或使用ARC或垃圾回收。我关闭了MainMenu.xib文件中的Auto Layout,只是在其中放置了一个WebView实例。我修改了AppDelegate以包含WebView实例的插座。

然后我创建了-applicationDidFinishLaunching:存根,如下所示:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSString *urlString = @"http://drive.google.com";
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    [[[self webView] mainFrame] loadRequest:urlRequest];
}

如果我收到重定向,他们似乎不会影响我显示页面的能力。

我们是否在同一页面上(没有双关语)?

编辑2:

好消息(或坏消息,取决于你的POV):重定向从来都不是问题(虽然它们确实有助于揭示真实情况)。

对于Google云端硬盘,WebView不是经过批准的浏览器。但是,您可以通过修改用户代理字符串来解决此问题(下面的N.B.)。这是修改后的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSString *urlString = @"http://drive.google.com";
    NSURL *url = [NSURL URLWithString:urlString];

    NSString *customUserAgent = [NSString stringWithFormat:@"%@ Version/6.0.2 Safari/8536.26.17", [[self webView] userAgentForURL:url]];

    [[self webView] setCustomUserAgent:customUserAgent];

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    [[[self webView] mainFrame] loadRequest:urlRequest];
}

N.B。:用户界面似乎功能齐全,但即便如此,Google可能会改变其确定浏览器内容的方法并打破此方案,因此请考虑自己发出警告。您可能希望探索其SDK,以获取访问Google云端硬盘的其他方法。

一如既往,祝你工作顺利。

答案 1 :(得分:0)

根据Apple文档中的WebView引用类,您必须设置符合webframeloaddelegate协议的委托。

[webView setFrameLoadDelegate:object];

然后在object中,你必须设置这个方法:

- (void)webView:(WebView *)sender willPerformClientRedirectToURL:(NSURL *)URL delay:(NSTimeInterval)seconds fireDate:(NSDate *)date forFrame:(WebFrame *)frame