Xcode IOS 7和IOS 8中的Youtube API

Xcode IOS 7和IOS 8中的Youtube API,xcode,ios7,uiwebview,ios8,youtube-api,Xcode,Ios7,Uiwebview,Ios8,Youtube Api,我对在我的应用程序中播放youtube视频有以下要求: 当容器视图控制器出现时自动播放 检测视频何时完成(我在此事件中启用控件) 它不是全屏的 支持全屏portrail和横向 与IOS 7和IOS 8完全兼容 首先,我尝试youtube ios player helper,结果如下: IOS 8:完美工作 IOS 7:视频在全屏上每次暂停,不流畅播放 我想这可能是更好的解决方案,但我不能让它在IOS 7中正常工作 第二个也是实际选项,我使用混合解决方案: IOS 8带有youtube I

我对在我的应用程序中播放youtube视频有以下要求:

  • 当容器视图控制器出现时自动播放
  • 检测视频何时完成(我在此事件中启用控件)
  • 它不是全屏的
  • 支持全屏portrail和横向
  • 与IOS 7和IOS 8完全兼容
首先,我尝试youtube ios player helper,结果如下:

  • IOS 8:完美工作
  • IOS 7:视频在全屏上每次暂停,不流畅播放
我想这可能是更好的解决方案,但我不能让它在IOS 7中正常工作

第二个也是实际选项,我使用混合解决方案: IOS 8带有youtube IOS player助手,IOS 7带有UIWebView和嵌入式youtube播放器。结果:

  • IOS 8:完美工作
  • IOS 7:可以工作,但1/5视频自动播放不工作,因此未检测到视频完成(我不知道为什么)
我很感激任何关于更好解决方案的建议

我的实际代码(第二个选项):

-(无效)youtubePlayerConfiguration{
NSString*版本=[[UIDevice currentDevice]系统版本];
如果([version floatValue]>=8.0){
NSDictionary*PlayerBars=@{
@“playsinline”:@1,
@“自动播放”:@1,
@“showinfo”:@0,
@“自动隐藏”:@1,
@“rel”:@0,
@“品牌”:@1
};
youtubeplyer.delegate=self;
[youtubePlayer加载withvideoid:self.videoId playerVars:playerVars];
}否则{
UIWebView*webView=[[UIWebView alloc]initWithFrame:youtubeplyer.frame];
[webView setAllowsInlineMediaPlayback:是];
[webView SetMediaPlaybackRequiresAction:否];
webView.delegate=self;
[self.view addSubview:webView];
NSString*embedHTML=[NSString stringWithFormat:@”\
\
\
\
\
函数onyoutubeiframeapiredy()\
{\
ytplayer=new YT.Player('playerId',{events:{onReady:onPlayerReady,onStateChange:onPlayerStateChange}})\
}\
函数onPlayerReady(a)\
{ \
a、 target.playVideo()\
}\
var done=false\
函数onPlayerStateChange(事件){\
如果(event.data==YT.PlayerState.PLAYING&&!done){\
设置超时(停止视频,6000)\
完成=正确\
}\
如果(event.data==YT.PlayerState.end){\
window.location='callback:anything'\
}\
}\
\
\
\
“,288150,self.videoId];
[webView loadHTMLString:EmbedHtmlBaseUrl:[[NSBundle mainBundle]resourceURL]];
webView.allowsInlineMediaPlayback=是;
webView.mediaplaybackrequiresseraction=否;
webView.scrollView.bounces=否;
youtubeplyer.hidden=是;
}
}
#pragma mark-播放器YouTube代理
-(void)playerViewIDbecomeready:(YTPlayerView*)playerView{
//[[NSNotificationCenter defaultCenter]postNotificationName:@“播放已开始”对象:self];
[播放视图播放视频];
}
-(void)playerView:(YTPlayerView*)playerView未更改为状态:(YTPlayerState)状态{
如果(状态==kYTPlayerStateEnded){
ratingView.editable=是;
ratingView.alpha=1;
ratingView.userInteractionEnabled=是;
}
}
-(void)playerView:(YTPlayerView*)playerView接收错误:(YTPlayerError)错误
{
NSLog(@“YTPlayerView:receivedError:%i”,错误);
}
#pragma标记-WebView委托
-(BOOL)webView:(UIWebView*)webView应加载WithRequest:(NSURLRequest*)请求导航类型:(UIWebViewNavigationType)导航类型{
NSLog(@“ENTRO-request:%@”,request);
if([[request URL]scheme]IsequalString:@“callback”]){
NSLog(@“获取回调”);
ratingView.editable=是;
ratingView.alpha=1;
ratingView.userInteractionEnabled=是;
返回否;
}
返回YES;
}

我在iOS 7上使用了以下代码,对我来说效果很好,我现在使用的是iOS 8,所以我使用的是

-(void)初始化YouTubepLayerWithVideoID(NSString*)videoId
{
NSString*youTubeVideoHTML=@“body{margin:0px 0px 0px 0px;}var tag=document.createElement('script');tag.src=”http://www.youtube.com/player_api';var firstScriptTag=document.getElementsByTagName('script')[0];firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);var player;函数onYouTubePlayerAPIReady(){player=new YT.player('player',{width:'1024',height:'728',videoId:'%@',playerBars:{controls:0,rel:0,branding:1,html5:0,showinfo:0},events:{'onReady':onPlayerReady,'onStateChange':onPlayerStateChange}};}函数onPlayerReady(event){event.target.playerStatechange();}函数onPlayerStateChange(event){如果(event.data==YT.PlayerState.end){}”;
NSString*html=[NSString stringWithFormat:youTubeVideoHTML,videoId];
_youtubePlayerView=[[UIWebView alloc]initWithFrame:CGRectMake(0,0,1024,768)];
_youtubePlayerView.backgroundColor=[UIColor blackColor];
_youtubePlayerView.delegate=self;
_youtubePlayerView.allowsInlineMediaPlayback=否;
[self.view addSubview:_youtubePlayerView];
_youtubePlayerView.MediaPlaybackRequireservion=否;
[\u youtubePlayerView loadHTMLString:html baseURL:[[NSBundle mainBundle]resourceURL]];
-(void)youtubePlayerConfiguration{

NSString *version = [[UIDevice currentDevice] systemVersion];


if ([version floatValue] >= 8.0) {

    NSDictionary *playerVars = @{

                                 @"playsinline" : @1,
                                 @"autoplay" : @1,
                                 @"showinfo" : @0,
                                 @"autohide" : @1,
                                 @"rel" : @0,
                                 @"modestbranding" : @1
                                 };

     youtubePlayer.delegate = self;
     [youtubePlayer loadWithVideoId:self.videoId playerVars:playerVars];

} else {
    UIWebView *webView = [[UIWebView alloc] initWithFrame:youtubePlayer.frame];
    [webView setAllowsInlineMediaPlayback:YES];
    [webView setMediaPlaybackRequiresUserAction:NO];
    webView.delegate = self;

    [self.view addSubview:webView];

    NSString* embedHTML = [NSString stringWithFormat:@"\
                           <html>\
                           <body style='margin:0px;padding:0px;'>\
                           <script type='text/javascript' src='http://www.youtube.com/iframe_api'></script>\
                           <script type='text/javascript'>\
                           function onYouTubeIframeAPIReady()\
                           {\
                           ytplayer=new YT.Player('playerId',{events:{onReady:onPlayerReady,onStateChange: onPlayerStateChange}})\
                           }\
                           function onPlayerReady(a)\
                           { \
                           a.target.playVideo(); \
                           }\
                           var done = false;\
                           function onPlayerStateChange(event) {\
                               if (event.data == YT.PlayerState.PLAYING && !done) {\
                                   setTimeout(stopVideo, 6000);\
                                   done = true;\
                               }\
                               if (event.data == YT.PlayerState.ENDED) {\
                                   window.location = 'callback:anything';\
                               }\
                           }\
                           </script>\
                           <iframe id='playerId' type='text/html' width='%d' height='%d' src='http://www.youtube.com/embed/%@?enablejsapi=1&rel=0&playsinline=1&autoplay=1&showinfo=0' frameborder='0'>\
                           </body>\
                           </html>", 288,150, self.videoId];
    [webView loadHTMLString:embedHTML baseURL:[[NSBundle mainBundle] resourceURL]];

    webView.allowsInlineMediaPlayback = YES;
    webView.mediaPlaybackRequiresUserAction = NO;
    webView.scrollView.bounces = NO;

    youtubePlayer.hidden = YES;
}

}


#pragma mark - Player YouTube Delegates

-(void)playerViewDidBecomeReady:(YTPlayerView *)playerView{
    //[[NSNotificationCenter defaultCenter] postNotificationName:@"Playback started" object:self];

    [playerView playVideo];
}

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state{
    if (state == kYTPlayerStateEnded) {
        ratingView.editable = YES;
        ratingView.alpha = 1;
        ratingView.userInteractionEnabled = YES;
    }
}

- (void)playerView:(YTPlayerView *)playerView receivedError:(YTPlayerError)error
{
    NSLog(@"YTPlayerView : receivedError :%i",error);
}

#pragma mark - WebView Delegate

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSLog(@"ENTRO - request:%@",request);

    if ( [[[request URL] scheme] isEqualToString:@"callback"] ) {

        NSLog(@"get callback");
        ratingView.editable = YES;
        ratingView.alpha = 1;
        ratingView.userInteractionEnabled = YES;
        return NO;

    }

    return YES;
}
-(void)initializeYouTubePlayerWithVideoID(NSString *)videoId
{
    NSString *youTubeVideoHTML = @"<html><head><style>body{margin:0px 0px 0px 0px;}</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:'1024', height:'728', videoId:'%@', playerVars: {controls:0,rel:0, modestbranding:1, html5:0, showinfo:0}, events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange } }); } function onPlayerReady(event) { event.target.playVideo(); } function onPlayerStateChange(event) { if (event.data == YT.PlayerState.ENDED){ } } </script> </body> </html>";

    NSString *html = [NSString stringWithFormat:youTubeVideoHTML, videoId];

    _youtubePlayerView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
    _youtubePlayerView.backgroundColor = [UIColor blackColor];
    _youtubePlayerView.delegate = self;
    _youtubePlayerView.allowsInlineMediaPlayback = NO;

    [self.view addSubview:_youtubePlayerView];

    _youtubePlayerView.mediaPlaybackRequiresUserAction = NO;
    [_youtubePlayerView loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerDidExitFullscreen:)
                                             name:@"UIMoviePlayerControllerDidExitFullscreenNotification"
                                           object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerDidEnterFullscreen:)
                                                 name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
                                           object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playbackStateDidChange:)
                                             name:@"MPAVControllerPlaybackStateChangedNotification"
                                           object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playbackDidEnd:)
                                             name:@"MPAVControllerItemPlaybackDidEndNotification"
                                           object:nil];
}

-(void)playbackStateDidChange:(NSNotification *)notification
{
    switch ([[notification.userInfo objectForKey:@"MPAVControllerNewStateParameter"]     intValue])
   {
        case 0:
            //Loading
            break;
        case 1:
            //Paused

            break;
        case 2:
            //Playing";
            break;
        case 3:
           //Buffering";
        break;

        default:
            break;
    }
}

-(void)playbackDidEnd:(NSNotification *)notification
{
    //Playback Ended
}

-(void)playerDidExitFullscreen:(NSNotification *)notification
{
     //playerDidExitFullscreen 
}

-(void)playerDidEnterFullscreen:(NSNotification *)notification
{
    //playerDidEnterFullscreen
}