iOS UIWebView 或 WKWebView URL 重定向

Posted

技术标签:

【中文标题】iOS UIWebView 或 WKWebView URL 重定向【英文标题】:iOS UIWebView or WKWebView URL redirect 【发布时间】:2017-03-29 12:36:47 【问题描述】:

我有一个 URL:http://listen.streamonomy.com/cooljazzflorida(例如)。这是我在 PLS 文件(由 SHOUTcast 收音机提供)中解析的用于流式音频的 URL。当我从浏览器(Safari 或 Google Chrome)打开它时,此 URL 会重定向到 http://streaming.shoutcast.com/cooljazzflorida?lang=fr-fr,我可以播放该流。

但是,在我的 ios 应用程序中,使用 UIWebView 或 WKWebView,重定向的 URL 是 http://streaming.shoutcast.com/cooljazzflorida_64?lang=fr-fr(然后是 _64),与浏览器不同,并且出现错误“找不到您需要的文件”。

有什么想法吗?谢谢。

编辑:说明问题的示例代码:

https://github.com/iDevelopper/RedirectURLSample.git

#import "ViewController.h"

@interface ViewController () <UIWebViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
    webView.delegate = self;
    [self.view addSubview:webView];

    NSString *urlString = @"http://listen.streamonomy.com/cooljazzflorida";
    /* If you enter this url using Safari browser, the redirected url is:
     http://streaming.shoutcast.com/cooljazzflorida?lang=fr-fr
     */
    NSURL *urlToPlay = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:urlToPlay];
    [webView loadRequest:request];


#pragma mark - UIWebView Delegate

- (void)webViewDidFinishLoad:(UIWebView *)webView

    NSURL *url = [webView.request mainDocumentURL];
    NSLog(@"DID FINISH The Redirected URL is: %@", url);
    /*
     The redirected url is: (not the same returned by the browser and this url is not found)
     http://streaming.shoutcast.com/cooljazzflorida_64?lang=en-us
    */


    // Set AVPlayerItem with the redirected URL
    // ...


@end

【问题讨论】:

使用AVPlayerViewController 代替UIWebview 流式传输音频/视频 我不使用 UIWebView 播放音频,但使用 AVPlayer 并且效果很好。我只是使用 UIWebViewDelegate 方法来知道要播放的重定向 URL 并设置 AVPlayerItem url。 那么请用您的代码更新您的问题 用示例代码编辑,谢谢! 【参考方案1】:

_64 地址确实不存在,Streamonomy 的错还没有注意到它并修复了它们的重定向逻辑。不同的重定向目标基于您请求中的 User-Agent 标头。我怀疑 Streamonomy 试图猜测请求设备并查询不同的比特率。我给你找了两个例子:

Mozilla/5.0 (iPad; CPU OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (Khtml, like Gecko) Version/10.0 Mobile/14C89 Safari/602.1

重定向到现有网址

Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1

重定向到不存在的_64

弄清楚确切的阈值是多少 :-) 同样值得注意的是,设置一个完全虚假的 UA,如 ignoremeidontneedyourhelp 会重定向到“正确的”(现有)URL。但如果您打算将该 UI/WKWebView 用于正常的公共 Web 浏览,这不是一个有用的策略。网站可能会被奇怪地呈现或以其他方式损坏。

【讨论】:

谢谢,我会尝试使用: - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse newRequest:(NSURLRequest *)request completionHandler: (void (^)(NSURLRequest *))completionHandler NSURLRequest *newRequest = request; // 播放 // ... completionHandler(nil);但不知道当app在后台时是否有效 我以为你想修复 UIWebView/WKWebView 给你错误的重定向。现在你会采取错误的重定向,尝试理解它并“纠正”它吗?当 Streamonomy 更改其重定向方案时(将重定向到您的“更正”黑客所期望的其他 URL),这将中断。您应该通过更改 User-Agent 来让 Streamonomy 相信您的浏览器是桌面浏览器。直接从服务器获取正确的重定向,防止不必要的黑客攻击。

以上是关于iOS UIWebView 或 WKWebView URL 重定向的主要内容,如果未能解决你的问题,请参考以下文章

swift - UIWebView 和 WKWebView(iOS12 之后替换UIWebView)

UI11上的UIWebView / WKWebView崩溃(用完可执行内存)

iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)

iOS - UIWebView 被 WKWebView 取代,但对于 Apple 它仍然存在

iOS UIWebview,禁用双击,允许点击 WKWebview

使用WKWebView替换UIWebView