【问题标题】:YouTube API not working in iOS (iPhone/iPad) but working fine in Desktop browsers?YouTube API 在 iOS (iPhone/iPad) 中不工作,但在桌面浏览器中工作正常?
【发布时间】:2013-05-06 23:44:30
【问题描述】:

我在一个简单的单页网站中使用 YouTube API。我可以播放视频,并且我的所有 YouTube 功能都可以在桌面浏览器中成功运行(IE 7 除外——也许这个问题会在你帮助我回答这个问题时得到解决)但它似乎不起作用在 iOS(iPhone 和 iPad)中根本没有。YouTube 播放器根本不显示,并且在 iOS 中根本没有 YouTube 功能的回忆。

下面是我的代码实现。如果我没有提供任何对这个问题有帮助的问题信息,请告诉我。我想从解决这个问题开始尽可能简单,然后在必要时提供其他信息。

/*==========================================================================
    YOUTUBE
========================================================================== */
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var YTready = false,
    playerIdList = [],
    ytPlayers = {};

// When YouTube API is ready, switch YTready to true and run the queue of videos should any exist
// and run a list of page-specified functions such as carousel setups
var YTreadyFunctions = {};
function onYouTubeIframeAPIReady() {
    console.log('YT Ready');
    YTready = true;
    if (playerIdList.length > 0) {
        runYouTubeIframeList(playerIdList);
    }
    for(id in YTreadyFunctions){
        var thisFunc = YTreadyFunctions[id];
        var thisArgs = thisFunc.args;
        thisFunc.func(thisArgs.id,thisArgs.counters,thisArgs.isHome,thisArgs.isAutoRot,thisArgs.galleryType);
    }
}

function shortID(elemId){
    return elemId.split('-').join('');
}

function initializeYouTubeIframe(playerId,params){
        //var playerId = thisList[x];
        var thisPlayer = document.getElementById(playerId);
        ytPlayers[shortID(playerId)] = new YT.Player(playerId, {
            width: thisPlayer.getAttribute('width'),
            height: thisPlayer.getAttribute('height'),
        playerVars: {
            autohide: 1,
            //autoplay: 1,
            theme: 'light',
            showinfo: 0,
            color: 'white',
            rel: 0,
            origin: document.location.hostname,
            wmode: 'transparent'
        },
        videoId: playerId,
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        });
}

function runYouTubeIframeList(thisList) {
    // If the YouTube iFrame API (onYouTubeIframeAPIReady is not ready yet,
    // add the player(s) to a list (playerIdList) to wait until the API is ready and then initialize
    if (!YTready) {
        playerIdList.concat(thisList);
    } else {
        // YT API is ready. Initialize the list of player iframes.
        var thisListLength = thisList.length;
        for (var x = 0; x < thisListLength; x++) {
            initializeYouTubeIframe(thisList[x]);
        }
    }
}
function onPlayerReady(event) {
    //alert('player ready');
}
function onPlayerStateChange(event) {
    //alert('state changed: ' + event.data);
    if (event.data == 3) {
        $('.loading').remove();
    }
    if (event.data == 1) {
        $('#i360-static-panel').css('display','none');
        $('.loading').remove();
        $('div#i360-questions > h2').fadeIn(500).removeClass('transparent');
    }
    if (event.data == 0) {
        $('#i360-answer-mask').slideUp(function () {
            $('p.active-answer').remove();
            $('div#i360-questions > ul').fadeIn(500).removeClass('transparent');
            $('div#i360-questions > ul > li').removeClass('i360-clicked-question');
        });
        $('.i360-shown').fadeOut(300);
        $(event.target.a.parentNode).children('#i360-static-panel').css('display','block');
    }
}

// run through all yt-players and add their ID to a list of to-be-initialized players
$('.yt-player').each(function(i){
    playerIdList.push($(this).attr('id'));
});
runYouTubeIframeList(playerIdList);

function setVideoCarouselThumb(response,element){
    if(response.data){
        if(response.data.thumbnail.hqDefault){
            element.getElementsByTagName('img')[0].src = response.data.thumbnail.hqDefault;
        } else if(response.data.thumbnail.sqDefault){
            element.getElementsByTagName('img')[0].src = response.data.thumbnail.sqDefault;
        }
    } else if (response.status){
        if(response.status == '403'){
            element.setAttribute('class',element.getAttribute('class') ? element.getAttribute('class') + ' private' : 'private');
        }
    }
}
function getYouTubeInfoById(type,getID,callback,args){
    //window.console && console.log('function: getYouTubeInfoById | type = ',type,' | getId = ',getID,' | args = ',args);
    //consoleThis('https://gdata.youtube.com/feeds/api/' + type + '/' + getID + '?v=2&prettyprint=true&alt=jsonc');
    $.ajax({
        url: 'https://gdata.youtube.com/feeds/api/' + type + '/' + getID + '?v=2&prettyprint=true&alt=jsonc',
        dataType: 'jsonp',
        context: args ? args : '',
        success: function(response){
            callback(response,this);
        },
        error: function(response){
            callback(response,this);
            //consoleThis(response);
        }
    });
}

// END YOUTUBE
</script>


    <meta name="apple-mobile-web-app-title" content="Roundup" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="apple-mobile-web-app-title" content="Roundup" />
    <meta name="viewport" content="minimum-scale=1.0, maximum-scale=1.0">

【问题讨论】:

  • 您是否为苹果/触控设备设置了所有元标记?
  • 我用我脑海中的元标记更新了这个问题。

标签: javascript ios youtube-api mobile-safari


【解决方案1】:

根据this other SO post,iOS 存在限制,其中 “...嵌入式媒体无法在 iOS 上的 Safari 中以编程方式自动播放 - 用户始终启动播放。” em>

我遇到了同样的问题,结果证明您可以通过 YouTube 的红色大“播放”按钮在 iOS 上正确嵌入并显示 YouTube-API IFrame,只是 iOS 不允许您可以使用自己的控件和 JavaScript 开始/停止视频。例如。您可以使用 JavaScript 进行下一个/上一个,但不能播放/暂停,这必须通过单击 on 视频,然后使用视频进度条旁边的本机控件来完成。

但是关于你第一段的最后一句话,抛开这些限制,YouTube 播放器应该显示,你所做的事情有问题(尽管我不够专业,无法判断)。我也在 a simple one-page website 这样做,随意看看我做了什么。

希望有帮助!

【讨论】:

  • 我正在试验这个问题并想在这里注册,如果我们尝试自动播放,视频不再响应。如果我们在onReady 时不执行playVideo(),一切正常。 [更新] 我看到的是,我们的控件只有在我们按下视频上的主要红色大按钮之后才起作用。
  • 我遇到了同样的问题。在用户按下红色播放按钮之前,我无法让游戏开始工作。 “自动播放” playerVars 标志不起作用,如果我尝试通过调用 playVideo() 方法播放视频,播放器会变黑,我无法再访问它(出现了一个简短的加载微调器,但会在玩家变黑之前迅速离开)。
  • @Redtopia 你修好了吗?我有同样的问题。在用户点击红色播放按钮之前,我什么也做不了。但之后我可以在 JS 中做 load() playVideo() pauseVideo()。
  • @Elyx0,我已经确定让用户点击视频以在移动设备上播放它们是设计使然。黑屏死机一定是iOS的bug。 (stackoverflow.com/questions/12496144/…)
猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2015-08-26
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多