YouTube 向我发出警告,称我的应用中嵌入的视频的标题应该是可点击的,并将用户带到 YouTube。
但是我无法理解这是如何发生的,因为我们所做的只是使用 WKWebview 来加载 url
我有什么遗漏的吗? url 中需要添加什么吗?
WKWebView *webView = [[WKWebView alloc] initWithFrame: self.videoContainerView.bounds];
webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"https://www.youtube.com/embed/%@", rowViewModel.videoId]]];
webView.clipsToBounds = YES;
webView.contentMode = UIViewContentModeScaleAspectFill;
[webView loadRequest:request];
我尝试四处查看是否有可以传递的参数,但我不确定是否找到了有用的东西。
好吧,事实证明,当用户点击标题时,YouTube 会阻止导航交互。因此,webkit 导航代理不会收到任何调用。
但这只是标题的情况
点击其他位置仍会将您带到 YouTube。
换句话说:
YouTube 故意阻止对标题的点击,并说我们违反了他们的条款和条件
因此你需要使用 WKUIDelegate 编写一个 hack
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
if (navigationAction.request.URL) {
[[UIApplication sharedApplication] openURL:navigationAction.request.URL options:@{} completionHandler:nil];
}
return nil;
}
并且还注入 javascript
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
NSString *js = @"document.querySelector('.ytp-title-link').onclick = function() { "
" window.webkit.messageHandlers.openInSafari.postMessage(this.href); "
" return false; "
"};";
[webView evaluateJavaScript:js completionHandler:nil];
}
并添加脚本处理程序
[webView.configuration.userContentController addScriptMessageHandler:self name:@"openInSafari"];
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"openInSafari"]) {
NSString *urlString = (NSString *)message.body;
NSURL *url = [NSURL URLWithString:urlString];
if (url) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}
}
}