Objective C 应用程序中的 YouTube 视频需要重定向到 YouTube

问题描述 投票:0回答:1

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

我尝试四处查看是否有可以传递的参数,但我不确定是否找到了有用的东西。

objective-c youtube youtube-api
1个回答
0
投票

好吧,事实证明,当用户点击标题时,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];
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.