YTPlayer 将重定向到 OAuth2 URL 并显示 'please stand by'
YTPlayer will redirect to OAuth2 URL and shows 'please stand by'
我正在尝试使用 YTPlayer 在 iOS 应用程序中播放直播。
我使用简单的代码,只将 'videoId' 更改为 'w-T2LJ_qLiw',这是 YouTube 上的实时视频。
但是当视频加载时,应用程序将打开 Safari 并重定向到 URL,如下所示:
和
然后视频将加载并播放,但被覆盖的将显示黑色块'Please stand by.'
如果视频不是 'live',视频播放效果很好。
我昨天之前试过,效果很好。 YTPlayer 怎么了?
我需要通过代码控制视频的动作,例如播放、暂停、重新加载。
我可以解决这个问题吗?
找到解决方案。
通过修改方法阻止App跳出
- (BOOL)handleHttpNavigationToUrl:(NSURL *) url
来自 YTPlayerView.m。
更改为以下内容:
if (ytMatch || adMatch) {
return YES;
} else {
// [[UIApplication sharedApplication] openURL:url];
// return NO;
return YES;
}
或者干掉这个方法,只写
return YES
这条路 'Please stand by...' 没有显示。
虽然周义棠的解决方案可能有效,但它违反了 YouTube 的服务条款。我修改了 handleHttpNavigationToUrl:
方法以在将用户从 UIWebView 带出并进入 Safari 之前检查这两个额外的 URL。
这是我的工作解决方案:
// YTPlayerView.m
// ...
NSString static *const kYTPlayerOAuthRegexPattern = @"^http(s)://accounts.google.com/o/oauth2/(.*)$";
NSString static *const kYTPlayerStaticProxyRegexPattern = @"^https://content.googleapis.com/static/proxy.html(.*)$";
// ...
- (BOOL)handleHttpNavigationToUrl:(NSURL *) url {
// Usually this means the user has clicked on the YouTube logo or an error message in the
// player. Most URLs should open in the browser. The only http(s) URL that should open in this
// UIWebView is the URL for the embed, which is of the format:
// http(s)://www.youtube.com/embed/[VIDEO ID]?[PARAMETERS]
NSError *error = NULL;
NSRegularExpression *ytRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerEmbedUrlRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *ytMatch =
[ytRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *adRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerAdUrlRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *adMatch =
[adRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *oauthRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerOAuthRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *oauthMatch =
[oauthRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *staticProxyRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerStaticProxyRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *staticProxyMatch =
[[staticProxyRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
if (ytMatch || adMatch || oauthMatch || staticProxyMatch) {
return YES;
} else {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
}
我还在项目 GitHub 上提出了此更改作为 PR #111。
编辑 6/10/15:截至今天,此修改已合并到代码库中。
我正在尝试使用 YTPlayer 在 iOS 应用程序中播放直播。
我使用简单的代码,只将 'videoId' 更改为 'w-T2LJ_qLiw',这是 YouTube 上的实时视频。
但是当视频加载时,应用程序将打开 Safari 并重定向到 URL,如下所示:
和
然后视频将加载并播放,但被覆盖的将显示黑色块'Please stand by.'
如果视频不是 'live',视频播放效果很好。
我昨天之前试过,效果很好。 YTPlayer 怎么了?
我需要通过代码控制视频的动作,例如播放、暂停、重新加载。
我可以解决这个问题吗?
找到解决方案。
通过修改方法阻止App跳出
- (BOOL)handleHttpNavigationToUrl:(NSURL *) url
来自 YTPlayerView.m。
更改为以下内容:
if (ytMatch || adMatch) {
return YES;
} else {
// [[UIApplication sharedApplication] openURL:url];
// return NO;
return YES;
}
或者干掉这个方法,只写
return YES
这条路 'Please stand by...' 没有显示。
虽然周义棠的解决方案可能有效,但它违反了 YouTube 的服务条款。我修改了 handleHttpNavigationToUrl:
方法以在将用户从 UIWebView 带出并进入 Safari 之前检查这两个额外的 URL。
这是我的工作解决方案:
// YTPlayerView.m
// ...
NSString static *const kYTPlayerOAuthRegexPattern = @"^http(s)://accounts.google.com/o/oauth2/(.*)$";
NSString static *const kYTPlayerStaticProxyRegexPattern = @"^https://content.googleapis.com/static/proxy.html(.*)$";
// ...
- (BOOL)handleHttpNavigationToUrl:(NSURL *) url {
// Usually this means the user has clicked on the YouTube logo or an error message in the
// player. Most URLs should open in the browser. The only http(s) URL that should open in this
// UIWebView is the URL for the embed, which is of the format:
// http(s)://www.youtube.com/embed/[VIDEO ID]?[PARAMETERS]
NSError *error = NULL;
NSRegularExpression *ytRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerEmbedUrlRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *ytMatch =
[ytRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *adRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerAdUrlRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *adMatch =
[adRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *oauthRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerOAuthRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *oauthMatch =
[oauthRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
NSRegularExpression *staticProxyRegex =
[NSRegularExpression regularExpressionWithPattern:kYTPlayerStaticProxyRegexPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSTextCheckingResult *staticProxyMatch =
[[staticProxyRegex firstMatchInString:url.absoluteString
options:0
range:NSMakeRange(0, [url.absoluteString length])];
if (ytMatch || adMatch || oauthMatch || staticProxyMatch) {
return YES;
} else {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
}
我还在项目 GitHub 上提出了此更改作为 PR #111。
编辑 6/10/15:截至今天,此修改已合并到代码库中。