ios7 UIWebView Youtubevideo

我有一个UIWebView的子类,我用来播放YouTube和本地video。 在iOS6下完美工作。 在升级到iOS7时,我遇到了一个问题,我不知道从哪里开始。 虽然子类在iOS7模拟器上播放YouTube和本地video时仍然可以正常工作,但是当我在设备上播放YouTube时,会看到以下消息:

Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextSaveGState: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextSetBlendMode: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextSetAlpha: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextTranslateCTM: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextScaleCTM: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextGetCTM: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextDrawImage: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. Sep 26 10:17:27 JRR-IPad SVOx[558] <Error>: CGContextGetCTM: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. 

===

这只发生在设备上,而不是在模拟器上,并且在iOS6下不会发生。 我已经在这里看到一些post,谈论与testing版上的各种类似的问题,但我还没有看到关于iOS7发布版本的评论。

我没有在我的代码中使用这些方法中的任何一种,所以这些消息是在库中产生的。

任何人? TIA。

使用此function,您可以在视图中运行YouTubevideo

UIWebView * videoView = [[UIWebView alloc] initWithFrame:self.view.bounds];

  NSString *strparse = [NSString stringWithFormat:@"http://www.youtube.com/watch?v=%@",youtubeVideoId]; NSRange rng = [strparse rangeOfString: @"watch?v="]; strparse = [strparse substringFromIndex:rng.location]; rng = [strparse rangeOfString:@"&feature="]; if (rng.length >0) { strparse = [strparse substringToIndex:rng.location]; } strparse = [strparse stringByReplacingOccurrencesOfString:@"watch?v=" withString:@""]; //http://www.youtube.com/embed/FJkiwbqlSy0 NSString *youTubeVideoHTML =[NSString stringWithFormat:@"<!DOCTYPE html><html><head><style>body{margin:0px 0px 0px 0px; background:#1111}</style></head> <body> <div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = \"http://www.youtube.com/player_api\"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; function onYouTubePlayerAPIReady() { player = new YT.Player('player', { width:'%0.0f', height:'%0.0f', videoId:'%@', events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange } });} function onPlayerReady(event) { event.target.playVideo(); } function onPlayerStateChange(event) {if(event.data === 0) { event.target.destroy(); }} </script> </body> </html>",0.0, 0.0,youtubeVideoId]; videoView.scalesPageToFit=NO; videoView.mediaPlaybackRequiresUserAction=NO; videoView.backgroundColor = [UIColor clearColor]; videoView.opaque= NO; [SharedObj showLoadingWithText:@""]; [videoView loadHTMLString:youTubeVideoHTML baseURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.youtube.com/watch?v=%@",youtubeVideoId]]]; [self.view addSubview:videoView]; 

这是IOS7中的testing代码,它的工作正常

 [self embedYouTube:[self getYTUrlStr:@"https://www.youtube.com/watch?v=Zq4o_Ca14aw"] frame:CGRectMake(0,40,self.view.frame.size.width, self.view.frame.size.height-40)]; - (NSString*)getYTUrlStr:(NSString*)url { if (url == nil) return nil; NSString *retVal = [url stringByReplacingOccurrencesOfString:@"watch?v=" withString:@"v/"]; NSRange pos=[retVal rangeOfString:@"version"]; if(pos.location == NSNotFound) { retVal = [retVal stringByAppendingString:@"?version=3&hl=en_EN"]; } return retVal; } - (void)embedYouTube:(NSString*)url frame:(CGRect)frame { NSString* embedHTML = @"\ <html><head>\ <style type=\"text/css\">\ body {\ background-color: transparent;\ color: white;\ }\ </style>\ </head><body style=\"margin:0\">\ <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \ width=\"%0.0f\" height=\"%0.0f\"></embed>\ </body></html>"; NSString* html = [NSString stringWithFormat:embedHTML, url, frame.size.width, frame.size.height]; if(videoView == nil) { videoView = [[UIWebView alloc] initWithFrame:frame]; videoView.delegate=self; [self.view addSubview:videoView]; } videoView.mediaPlaybackAllowsAirPlay=YES; videoView.allowsInlineMediaPlayback=YES; [videoView loadHTMLString:html baseURL:nil]; } 

我在我的应用程序中使用以下方式,并在iOS6和iOS 7中工作。可能是它的作品。

 NSString *youTubeID = [self extractYoutubeID:url]; // url is youtube url NSString *embedHTML =[NSString stringWithFormat:@"\ <html><head>\ <style type=\"text/css\">\ body {\ background-color: #666666;\ padding:%f %f %f %f;\ color: blue;\ }\ </style>\ </head><body style=\"margin:0\">\ <iframe height=\"%f\" width=\"%f\" title=\"YouTube Video\" class=\"youtube-player\" src=\"http://www.youtube.com/embed/%@\" ></iframe>\ </body></html>",paddingTop,paddingRight,paddingBottom,paddingLeft,videoHeight,videoWidth,youTubeID]; [self.webView loadHTMLString:embedHTML baseURL:nil]; - (NSString *)extractYoutubeID:(NSString *)youtubeURL { //NSLog(@"youtube %@",youtubeURL); NSError *error = NULL; NSString *regexString = @"(?<=v(=|/))([-a-zA-Z0-9_]+)|(?<=youtu.be/)([-a-zA-Z0-9_]+)"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:NSRegularExpressionCaseInsensitive error:&error]; NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:youtubeURL options:0 range:NSMakeRange(0, [youtubeURL length])]; if(!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { NSString *substringForFirstMatch = [youtubeURL substringWithRange:rangeOfFirstMatch]; return substringForFirstMatch; } return nil; } 

尝试这个:

 NSString* videoUrl = @"//www.youtube.com/embed/Of_hjbYCx4Y"; if([videoUrl hasPrefix:@"//"]) { videoUrl = [NSString stringWithFormat:@"https:%@", videoUrl]; // or http // if its a local file add proper scheme like "file:///" } NSString* iframeWidth = @"100%"; NSString* iframeHeight = @"240px"; NSString *iframeHTML =[NSString stringWithFormat:@"<iframe width=\"%@\" height=\"%@\" src=\"%@\" frameborder=\"0\" allowfullscreen></iframe>", iframeWidth, iframeHeight, videoUrl]; // you can directly use iframeHTML below or u can wrap it up in body and span tags and then use it if u need to add any extra stuff or customize the page itself [videoWebView loadHTMLString:htmlString baseURL:nil]; 

确保两件事情:videourl开始于http (正确的scheme),并取代/ watch?v = embedded/如果你没有它已经在url中。 检查这里给出的其他答案,看看如何做到这一点。 希望能帮助到你。

YouTube提供了一个框架,使我们免于直接使用networking视图的麻烦。 该框架位于: https : //github.com/youtube/youtube-ios-player-helper

所有你需要做的就是创build一个YTPlayerView视图,将其添加到视图层次结构中,并添加你喜欢的约束并加载video。 像这样:

  youTubePlayer = YTPlayerView() youTubePlayer!.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(youTubePlayer!) youTubePlayer!.pinAllAnchors(to: contentView) youTubePlayer!.load(withVideoId: url.youTubeVideoId()!) 

请注意,pinAllAnchors和youTubeVideoId是我创build的助手。 他们不是框架的一部分。