我想我已经涵盖了stackoverflow中的大部分相关帖子。不幸的是,我仍然可以;我找不到答案。
基本上,我的应用程序包含一个UIWebview,通过(youtube JS API)自动播放youtube视频
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YT_Player" ofType:@"html"] isDirectory:NO]]];
包含这行代码的函数每x分钟调用一次,其中x来自数据库。这是由完成的
[self performSelector:@selector(resetVideo) withObject:self afterDelay:x];
整个功能如下:
-(void) resetVideo {
[webView removeFromSuperview];
webView.delegate = nil;
[webView stopLoading];
[webView release];
webView = [[UIWebView alloc] initWithFrame:CGRectMake(12, 20, 300, 200)];
webView.delegate = self;
webView.userInteractionEnabled = NO;
webView.allowsInlineMediaPlayback = YES;
[webView setMediaPlaybackRequiresUserAction:NO];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YT_Player" ofType:@"html"] isDirectory:NO]]];
[self.view addSubview:webView];
}
此外,在webViewDidFinishLoad:中
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//call the javascript in YT_Player.html to set the video code, which comes
from the db as well
// done by using stringByEvaluatingJavaScriptFromString:scriptStr
}
当应用程序启动时,它总是很好地播放youtube视频,然后当下一个视频试图出现时,它只是在UIWebView区域显示为白色屏幕。此外,在我看来,这个问题只存在于真实的设备中(而不是模拟器上)。
更多信息:我定义了UIWebView*webView;英寸小时我尝试过实现这样的方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
但没有显示任何错误。
任何建议都将不胜感激。
编辑:经过进一步的调查,问题可能是由于onPlayerReady()事件没有被激发。
当您一次又一次地重新创建UIWebView时,我看到了一些奇怪之处。与其这样做,不如尝试调用JavaScript函数loadVideoById()
?要从Objective-C实现这一点,您可以调用:
[webView stringByEvaluatingJavaScriptFromString:"loadVideoById('kt2n27-pi_s')"];
为了让iframe播放器更容易嵌入iOS应用程序,我们最近发布了一个助手库,您可以通过CocoaPods安装该库。看看吧。我们的建议之一是,如果可以的话,不要一遍又一遍地重新创建UIWebView。
您持有一个对webView对象的强引用,然后从superView中删除该对象,从而获得白色屏幕。您可以根据需要创建webView对象,而不是持有强引用,也可以切换它的隐藏&userInteractionEnabled属性。
没有强有力的参考:
- (void)resetVideo {
for (id_object in self.view.subview) {
if ([id_object isMemberOfClass: [UIWebView class]]) {
id_object = nil;
[id_object removeFromSuperView];
}
}
UIWebView* oWebView = [[UIWebView alloc] initWithFrame:CGRectMake(12, 20, 300, 200)];
// .. finish as you have above
}