这真让我烦恼。我有一个webView,我试图把它加载到drive.google.com。但是,由于该站点上的重定向数量,webView不执行任何操作。我知道加载webView的代码有效,并且该URL是正确的,因为我收到了didFailWithProvisionalLoadWithError消息。这就是我知道这是重定向问题的方式。
我已经看了一遍,但却无法改变允许的重定向数量。我知道这是可能的,因为Safari可以处理它。必须有某种委托方法来覆盖。今天没有代码,因为我所有的搜索(价值4天)都让我一无所获。
如果有人有想法,请告诉我。仅供参考,这是Cocoa(WebView)不是cocoa touch(UIWebView)。感谢。
答案 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