1

这真的让我很烦。我有一个 webView,我正试图让它加载 drive.google.com。但是,由于该站点上的重定向数量众多,webView 什么也不做。我知道加载 webView 的代码有效,并且该 URL 是正确的,因为我收到了 didFailWithProvisionalLoadWithError 消息。这就是我知道这是重定向问题的方式。

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

如果有人有想法,请告诉我。仅供参考,这是可可(WebView)而不是可可触摸(UIWebView)。谢谢。

4

2 回答 2

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 Drive,WebView 不是经过批准的浏览器。但是,您可以通过修改用户代理字符串来解决这个问题(注意,如下)。这是修改后的代码:

- (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];
}

注意:用户界面看起来功能齐全,但即便如此,谷歌可能会改变其确定浏览器是什么的方式并破坏此方案,因此请考虑自己警告。您可能想探索他们的 SDK 以获得访问 Google Drive 的可能替代方法。

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

于 2012-11-20T23:50:04.010 回答
0

根据 Apple 文档中的 WebView 参考类,您必须设置一个符合 webframeloaddelegate 协议的委托。

[webView setFrameLoadDelegate:object];

然后在对象中,您必须设置此方法:

- (void)webView:(WebView *)sender willPerformClientRedirectToURL:(NSURL *)URL delay:(NSTimeInterval)seconds fireDate:(NSDate *)date forFrame:(WebFrame *)frame 
于 2012-11-28T05:36:44.013 回答