Một số vấn đề nảy sinh trong vài ngày qua với API nhúng YouTube. Vấn đề là khi bạn nhúng một video với API chính thức, nó chỉ đơn giản là không cho phép bạn truy cập vào API. Khi bạn cố gắng truy cập vào API, bạn nhận được thông báo lỗi trên nhật ký (IOS) và nếu bạn cố gắng phát video thông qua API, video sẽ bị tắt. Nếu bạn tải nó qua API, nhưng bạn không sử dụng API, người dùng có thể phát video bằng vòi nước.Sự cố API nhúng của YouTube trên iOS và Android
Vấn đề tồn tại trên các trình duyệt sau:
IOS 7 Safari trên iPad và iPhone IOS 7 Chrome trên iPad và iPhone Android 4 Chrome
(nút play của tôi sử dụng API để phát video và sản xuất các lỗi) JSfiddle: thông điệp http://jsfiddle.net/frdd8nvr/6/
lỗi:
Unable to post message to https://www.youtube.com. Recipient has origin http://fiddle.jshell.net.
postMessage[native code]:0
Jwww-widgetapi.js:26:357
Nwww-widgetapi.js:25
(anonymous function)[native code]:0
html5player.js:1201:97
Blocked a frame with origin "https://www.youtube.com" from accessing a frame with origin "http://jsfiddle.net". The frame requesting access has a protocol of "https", the frame being accessed has a protocol of "http". Protocols must match.
Một số thông tin gỡ lỗi:
Khi tôi thấy API tạo iframe trên trang web. Src là đôi khi http và đôi khi https.
thử nghiệm của tôi cho thấy rằng hầu hết các lần máy chủ của YouTube chỉ đơn giản VỊ TRÍ: https: // ... yêu cầu đến địa chỉ https, nhưng khoảng 10% họ phục vụ theo yêu cầu http với nội dung thích hợp.
Tôi nghĩ bằng cách nào đó vấn đề liên quan đến https bắt buộc, nhưng tôi không thể tìm ra giải pháp. Bạn có trải nghiệm giống nhau không? Bạn có một số loại giải pháp cho vấn đề này? Có phải đó là lỗi của YouTube không?
mã kiểm tra của tôi:
<div id="myvideo"></div>
<button id="play-button">Play</button>
JS:
var tag = document.createElement("script");
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
onYouTubeIframeAPIReady = function() {
var vars = {
enablejsapi: 1,
origin: window.location.protocol + "//" + window.location.host,
autoplay: 0,
modestbranding: 1,
wmode: "opaque",
forceSSL: false
};
if (+(navigator.platform.toUpperCase().indexOf('MAC') >= 0 && navigator.userAgent.search("Firefox") > -1)){
vars.html5 = 1;
}
var playerobj = new YT.Player('myvideo', {
videoId: 'ZPy9VCovVME',
wmode: 'opaque',
playerVars: vars,
events: {
onReady: function(){
$('#play-button').on('click', function(){
playerobj.playVideo();
});
//playerobj.playVideo();
},
onStateChange: function(state){
switch(state.data){
case YT.PlayerState.PLAYING:
break;
//case YT.PlayerState.PAUSED:
case YT.PlayerState.ENDED:
break;
}
}
}
});
}
tôi không chắc chắn, có lẽ tôi không hiểu điều gì đó nhưng jsfiddle của bạn đang làm việc tốt. Bạn có nghĩa là nó CHỈ trên ios? – mpgn
Nó không hoạt động trên IOS và Android và có lỗi trên bàn điều khiển những gì tôi đã viết. Dường như đối với tôi, nó không hoạt động khi iframe đó chuyển hướng sang https, nhưng tôi không thể tìm cách ngăn chặn chuyển hướng đó ... Có thể bạn đã nhận được phản hồi từ máy chủ khác hoặc phiên bản phần mềm máy chủ khác đang chạy trên đó. Tôi nghĩ điều này có thể xảy ra vì đôi khi tôi không chuyển hướng đến https .. –