Iphone YouTube视频播放在iOS6上中断(在iOS5上工作正常)
在我的应用程序中,我有一个按钮,按下这个按钮,你可以观看youtube视频(电影预告片)。在应用程序中,无需启动safari。下面您可以看到一个代码片段。这段代码在iOS5下运行良好。但是,在iOS 6中,findButtonInView中的UIButton始终为零。你知道原因是什么吗Iphone YouTube视频播放在iOS6上中断(在iOS5上工作正常),iphone,ios,youtube,ios6,Iphone,Ios,Youtube,Ios6,在我的应用程序中,我有一个按钮,按下这个按钮,你可以观看youtube视频(电影预告片)。在应用程序中,无需启动safari。下面您可以看到一个代码片段。这段代码在iOS5下运行良好。但是,在iOS 6中,findButtonInView中的UIButton始终为零。你知道原因是什么吗 youtubeWebView.delegate = self; youtubeWebView.backgroundColor = [UIColor clearColor]; NSString* embedHTM
youtubeWebView.delegate = self;
youtubeWebView.backgroundColor = [UIColor clearColor];
NSString* embedHTML = @" <html><head> <style type=\"text/css\"> body {background-color: transparent; color: white; }</style></head><body style=\"margin:0\"><embed id=\"yt\" src=\"%@?version=3&app=youtube_gdata\" type=\"application/x-shockwave-flash\"width=\"%0.0f\" height=\"%0.0f\"></embed></body></html>";
NSURL *movieTrailer;
if(tmdbMovie) movieTrailer = tmdbMovie.trailer;
else movieTrailer = [NSURL URLWithString:movie.trailerURLString];
NSString *html = [NSString stringWithFormat:embedHTML,
movieTrailer,
youtubeWebView.frame.size.width,
youtubeWebView.frame.size.height];
[youtubeWebView loadHTMLString:html baseURL:nil];
[self addSubview:youtubeWebView];
- (void)webViewDidFinishLoad:(UIWebView *)_webView {
isWatchTrailerBusy = NO;
[manager displayNetworkActivityIndicator:NO];
//stop the activity indicator and enable the button
UIButton *b = [self findButtonInView:_webView];
//TODO this returns null in case of iOS 6, redirect to the youtube app
if(b == nil) {
NSURL *movieTrailer;
if(tmdbMovie) {
movieTrailer = tmdbMovie.trailer;
} else {
movieTrailer = [NSURL URLWithString:movie.trailerURLString];
}
[[UIApplication sharedApplication] openURL:movieTrailer];
} else {
[b sendActionsForControlEvents:UIControlEventTouchUpInside];
}
}
- (UIButton *)findButtonInView:(UIView *)view {
UIButton *button = nil;
if ([view isMemberOfClass:[UIButton class]]) {
return (UIButton *)view;
}
if (view.subviews && [view.subviews count] > 0) {
for (UIView *subview in view.subviews) {
button = [self findButtonInView:subview];
if (button) return button;
}
}
return button;
}
youtubeWebView.delegate=self;
youtubeWebView.backgroundColor=[UIColor clearColor];
NSString*embedHTML=@“正文{背景色:透明;颜色:白色;}”;
NSURL*电影制作人;
如果(tmdbMovie)movieTrailer=tmdbMovie.trailer;
else movieTrailer=[NSURL URLWithString:movie.trailerURLString];
NSString*html=[NSString stringWithFormat:embedHTML,
电影制作人,
youtubeWebView.frame.size.width,
youtubeWebView.frame.size.height];
[youtubeWebView loadHTMLString:html baseURL:nil];
[自添加子视图:youtubeWebView];
-(无效)webViewDidFinishLoad:(UIWebView*)\u webView{
isWatchTrailerBusy=否;
[manager displayNetworkActivityIndicator:否];
//停止活动指示器并启用按钮
UIButton*b=[自查找按钮视图:_webView];
//TODO如果是iOS 6,则返回null,重定向到youtube应用程序
如果(b==nil){
NSURL*电影制作人;
if(tmdbMovie){
movieTrailer=tmdbMovie.trailer;
}否则{
movieTrailer=[NSURL URLWithString:movie.trailerURLString];
}
[[UIApplication sharedApplication]openURL:movieTrailer];
}否则{
[b发送控制事件的操作:UIControlEventTouchUpInside];
}
}
-(UIButton*)查找按钮视图:(UIView*)视图{
UIButton*按钮=无;
if([view IsMemberOf类:[UIButton类]]){
返回(UIButton*)视图;
}
如果(view.subviews&&[view.subviews count]>0){
用于(UIView*视图中的子视图。子视图){
按钮=[自查找按钮视图:子视图];
如果(按钮)返回按钮;
}
}
返回按钮;
}
苹果改变了iOS6处理YouTube视频的方式。我也在使用findButtonInView方法,但这不再有效
我发现以下方法似乎有效(未在iOS<6中测试):
未经测试,不确定这是否是问题所在,因为我不知道您使用的URL。但我在以下几点上绊倒了: 从iOS 6开始,以
http://www.youtube.com/watch?v=oHg5SJYRHA0
将不再工作。这些URL用于在YouTube网站上观看视频,而不是嵌入网页。相反,此处描述了应使用的格式:
在中,我正在研究同样的一般问题,我将分享我提出的方法。对于我的特殊情况,我还有一些需要解决的问题,但是一般的方法可能适合您,这取决于您的UI需求 如果您构建HTML嵌入代码,使YouTube播放器覆盖UIWebView的整个边界,则UIWebView实际上会成为一个大的播放按钮—触摸其表面上的任何位置都会将视频启动到本机媒体播放器中。要创建按钮,只需使用userInteractionEnabled设置为NO的UIView覆盖UIWebView。在这种情况下,UIWebView的大小是否重要?不太可能,因为视频将在本地播放器中打开 如果您希望用户将UI的某个区域视为视频要“播放”的区域,那么您可以从YouTube抓取视频的缩略图,并将其放置在任何位置。如果需要,您可以在该视图后面放置第二个UIWebView,因此如果用户触摸该视图,视频也会启动,或者只是将另一个UIWebView展开,使其位于这两个视图的“后面”
如果您发布了UI的屏幕截图,我可以提出一些更具体的建议,但基本的想法是将UIWebView变成一个按钮,在其前面放置一个禁用用户交互的视图。我发现下面的代码适用于iOS5和iOS6。在我的示例中,我有一个包含视频url的文本字段。我首先将格式转换为相同的起始字符串'http://m...“。然后我检查格式是否是带有'watch?v='的旧格式,然后用新格式替换。我已经在带iOS5的iPhone上以及在iOS5和iOS6的模拟器中对此进行了测试:
-(IBAction)loadVideoAction {
[activityIndicator startAnimating];
NSString *urlString = textFieldView.text;
urlString = [urlString stringByReplacingOccurrencesOfString:@"http://www.youtube" withString:@"http://m.youtube"];
urlString = [urlString stringByReplacingOccurrencesOfString:@"http://m.youtube.com/watch?v=" withString:@""];
urlString = [NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", urlString];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[activityIndicator stopAnimating];
}
dharmabruce解决方案在iOS 6上运行得非常好,但为了使其在iOS 5.1上运行,我必须用playVideo()替换javascript click(),并且必须将UIWebView的MediaPlaybackRequiresAction设置为NO 以下是修改后的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView.mediaPlaybackRequiresUserAction = NO;
}
- (void)playVideo
{
self.autoPlay = YES;
// Replace @"y8Kyi0WNg40" with your YouTube video id
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", @"y8Kyi0WNg40"]]]];
}
// UIWebView delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (self.autoPlay) {
self.autoPlay = NO;
[self clickVideo];
}
}
- (void)clickVideo {
[self.webView stringByEvaluatingJavaScriptFromString:@"\
function pollToPlay() {\
var vph5 = document.getElementById(\"video-player-html5\");\
if (vph5) {\
vph5.playVideo();\
} else {\
setTimeout(pollToPlay, 100);\
}\
}\
pollToPlay();\
"];
}
我相信问题在于触发webViewDidFinishLoad时,UIButton还没有添加到视图中。我实现了一个小延迟,以便在回调返回后找到按钮,它在ios5和ios6上对我有效。缺点是无法保证UIButton在延迟后可以找到
- (void)autoplay {
UIButton *b = [self findButtonInView:webView];
[b sendActionsForControlEvents:UIControlEventTouchUpInside]; }
- (void)webViewDidFinishLoad:(UIWebView *)_webView {
[self performSelector:@selector(autoplay) withObject:nil afterDelay:0.3]; }
我必须使用url,这是唯一对我有效的方法我已经解决了dharmabruce和JimmY2K解决方案的问题,因为它只在第一次播放视频时有效,正如Dee 以下是代码(包括视频结束时的事件):
我正在使用新的HTML iFrame API(这是BTW推荐的方式)嵌入youtube视频,这种自动播放技术findButtonInView从未对我起作用(返回null)@MSK你有关于使用iframes的教程或代码片段的链接吗?thx请看我的问答thx。这意味着不可能在应用程序中按一个按钮观看youtube视频?它对我从来都不起作用,而且它是一种黑客行为,不能保证它在下一次操作系统更新中起作用。我修改了t他
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView.mediaPlaybackRequiresUserAction = NO;
}
- (void)playVideo
{
self.autoPlay = YES;
// Replace @"y8Kyi0WNg40" with your YouTube video id
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", @"y8Kyi0WNg40"]]]];
}
// UIWebView delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (self.autoPlay) {
self.autoPlay = NO;
[self clickVideo];
}
}
- (void)clickVideo {
[self.webView stringByEvaluatingJavaScriptFromString:@"\
function pollToPlay() {\
var vph5 = document.getElementById(\"video-player-html5\");\
if (vph5) {\
vph5.playVideo();\
} else {\
setTimeout(pollToPlay, 100);\
}\
}\
pollToPlay();\
"];
}
- (void)autoplay {
UIButton *b = [self findButtonInView:webView];
[b sendActionsForControlEvents:UIControlEventTouchUpInside]; }
- (void)webViewDidFinishLoad:(UIWebView *)_webView {
[self performSelector:@selector(autoplay) withObject:nil afterDelay:0.3]; }
- (void)embedYouTube:(NSString *)urlString frame:(CGRect)frame {
videoView = [[UIWebView alloc] init];
videoView.frame = frame;
videoView.delegate = self;
[videoView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];// this format: http://www.youtube.com/embed/xxxxxx
[self.view addSubview:videoView];
//https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MediaPlayer.framework/MPAVController.h
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playbackDidEnd:)
name:@"MPAVControllerItemPlaybackDidEndNotification"//@"MPAVControllerPlaybackStateChangedNotification"
object:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//http://stackoverflow.com/a/12504918/860488
[videoView stringByEvaluatingJavaScriptFromString:@"\
var intervalId = setInterval(function() { \
var vph5 = document.getElementById(\"video-player\");\
if (vph5) {\
vph5.playVideo();\
clearInterval(intervalId);\
} \
}, 100);"];
}
- (void)playbackDidEnd:(NSNotification *)note
{
[videoView removeFromSuperview];
videoView.delegate = nil;
videoView = nil;
}